Created
December 13, 2019 12:21
-
-
Save psaia/4c3800e58a66a3e787442d58d03ed436 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const EnvironmentProvider = environment => props => { | |
return ( | |
<ReactRelayContext.Provider | |
{...props} | |
value={{ environment: environment, variables: {} }} | |
/> | |
); | |
}; | |
async function createRelayEnvironment(req) { | |
const relaySSRMiddleware = new RelayServerSSR(); | |
relaySSRMiddleware.debug = true; | |
const network = new RelayNetworkLayer([ | |
relaySSRMiddleware.getMiddleware({ | |
schema: await generateSchema(), | |
contextValue: prepareContext(req) | |
}) | |
]); | |
const store = new Store(new RecordSource()); | |
const environment = new Environment({ | |
network, | |
store | |
}); | |
return { | |
store, | |
environment, | |
relaySSRMiddleware | |
}; | |
} | |
export default async function render(req, res, next) { | |
try { | |
const { | |
environment, | |
store, | |
relaySSRMiddleware | |
} = await createRelayEnvironment(req); | |
const helmetContext: FilledContext = { helmet: null }; | |
const EnvProvider = EnvironmentProvider(environment); | |
// Kick off an initial render to start the queries. | |
ReactDOMServer.renderToString( | |
<EnvProvider> | |
<FooApp /> | |
</EnvProvider> | |
); | |
// Wait for all the queries to load. | |
const relayData = await relaySSRMiddleware.getCache(); | |
// Inject fully loaded data into another rendering. | |
const CompleteEnvProvider = EnvironmentProvider( | |
new Environment({ | |
network: Network.create(() => relayData[0][1]), | |
store | |
}) | |
); | |
// Re-compile, this time with complete html. | |
const html = ReactDOMServer.renderToString( | |
<CompleteEnvProvider> | |
<FooApp /> | |
</CompleteEnvProvider> | |
); | |
res.status(200).send(`... output to be hydrated ...`); | |
} catch (error) { | |
res.status(500).send(`... Some error handling message ...`); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment