Skip to content
This repository was archived by the owner on Apr 8, 2020. It is now read-only.

How to do ssr for react-apollo #1253

Closed
Risbot opened this issue Sep 2, 2017 · 2 comments
Closed

How to do ssr for react-apollo #1253

Risbot opened this issue Sep 2, 2017 · 2 comments

Comments

@Risbot
Copy link

Risbot commented Sep 2, 2017

Hi all,

I try to do server side rendering apollo. I did update file boot-server.tsx to this:

import * as React from 'react';
import { ApolloClient, ApolloProvider, renderToStringWithData, createNetworkInterface } from 'react-apollo';
import { StaticRouter } from 'react-router-dom';
import { createServerRenderer, RenderResult } from 'aspnet-prerendering';
import { routes } from './routes';
import { renderToString } from 'react-dom/server';

export default createServerRenderer(params => {
    return new Promise<RenderResult>((resolve, reject) => {
        const basename = params.baseUrl.substring(0, params.baseUrl.length - 1);
        const urlAfterBasename = params.url.substring(basename.length);
		const networkInterface = createNetworkInterface({
		  uri: '/api/graphql',
		});

		const client = new ApolloClient({
		  ssrMode: true,
		  networkInterface
		});

        const routerContext: any = {};
        const app = (
			<ApolloProvider client={ client }>
                <StaticRouter basename={ basename } context={ routerContext } location={ params.location.path } children={ routes } />
			</ApolloProvider>
        );

        if (routerContext.url) {
            resolve({ redirectUrl: routerContext.url });
            return;
        }
    
		params.domainTasks.then(() => {
			renderToStringWithData(app).then((content) => {
				resolve({
					html: content
				});
			});
        }, reject); 
    });
});

but it got me this error:

An unhandled exception occurred while processing the request.

NodeInvocationException: Prerendering timed out after 30000ms because the boot function in 'ClientApp/dist/main-server' returned a promise that did not resolve or reject. Make sure that your boot function always resolves or rejects its promise. You can change the timeout value using the 'asp-prerender-timeout' tag helper.

can you help me what i have a bad?

thank for all help

@Risbot
Copy link
Author

Risbot commented Sep 3, 2017

This works

import * as React from 'react';
import { ApolloClient, ApolloProvider, renderToStringWithData, createNetworkInterface } from 'react-apollo';
import { StaticRouter } from 'react-router-dom';
import { createServerRenderer, RenderResult } from 'aspnet-prerendering';
import { routes } from './routes';
import { renderToString } from 'react-dom/server';

export default createServerRenderer(params => {
    return new Promise<RenderResult>((resolve, reject) => {
        const basename = params.baseUrl.substring(0, params.baseUrl.length - 1);
		const urlAfterBasename = params.url.substring(basename.length);


		const networkInterface = createNetworkInterface({
			uri: '/api/graphql',
			
		});

		const client = new ApolloClient({
		  ssrMode: true,
		  networkInterface
		});

        const routerContext: any = {};
        const app = (
			<ApolloProvider client={ client }>
                <StaticRouter basename={ basename } context={ routerContext } location={ params.location.path } children={ routes } />
			</ApolloProvider>
        );

        if (routerContext.url) {
            resolve({ redirectUrl: routerContext.url });
            return;
        }
    
	params.domainTasks.then(() => {
		resolve({
			html: renderToString(app)
		});
        }, reject); 
    });
});

@SteveSandersonMS
Copy link
Member

Glad you solved it.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants