Skip to content

Instantly share code, notes, and snippets.

@tulios
Created February 3, 2015 20:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tulios/92f4ec801a72935f0389 to your computer and use it in GitHub Desktop.
Save tulios/92f4ec801a72935f0389 to your computer and use it in GitHub Desktop.
Server side ReactJS with state
var Promise = require('promise');
var React = require('react/addons');
var Router = require('react-router');
var App = buildRequire('app-server-bundle');
var parseAssetManifest = appServerRequire('utils/parse-asset-manifest');
var assetManifest = parseAssetManifest(App.Settings.ASSET_HOST);
function fetchData(routes, done) {
var prerenderRoutes = routes.filter(function(route) {
return route.handler.prerender;
}).reduce(function(promises, route) {
promises.push(new Promise(function(resolve, reject) {
route.handler.fetch(resolve).fail(reject);
}));
return promises;
}, []);
return Promise.all(prerenderRoutes);
}
var RenderAction = function(req, res) {
var intentPath = req.query['path'] || '';
Router.run(App.Routes, intentPath, function(Handler, state) {
fetchData(state.routes).then(function(data) {
if (data.length === 1) data = data[0];
res.json({
js: assetManifest.js,
css: assetManifest.css,
component: React.renderToString(React.createElement(Handler, {data: data})),
state: JSON.stringify(data)
});
});
});
}
module.exports = RenderAction;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment