onready(() => { var store = configureStore(window.REDUX_INITIAL_STATE || {}); window.REDUX_INITIAL_STATE = null; /** * Watch location changes */ browserHistory.listen(location => { var state = store.getState(); location = location.pathname + location.search; location = location.replace(/[?]$/, ''); if (!location.match(/^\/(en|ru)/)) { location = location.replace(/^\/(en|ru)/, ''); location = '/' + state.lang + location; } if (state.location == location) { return; } store.dispatch(setLocation(location)); }); ReactDOM.render( <Provider store={store}> <Router history={browserHistory}> {routes(store)} </Router> </Provider>, document.getElementById('react-root') ); });
app.use((req, res) => { // make store var store = configureStore(); var user_ip = false; var user_session = false; var old_browser = false; if (req.headers) { if (req.headers['x-real-ip']) { user_ip = req.headers['x-real-ip']; } if (req.headers['user-agent']) { old_browser = old_browser || !!req.headers['user-agent'].match( /MSIE\s*\d+/i ); old_browser = old_browser || !!req.headers['user-agent'].match( /Trident\/\s*\d+/i ); old_browser = old_browser || !!req.headers['user-agent'].match( /Opera Mini\/\s*\d+/i ); old_browser = old_browser || !!req.headers['user-agent'].match( /UCWEB\/\s*\d+/i ); } } if (req.headers && req.headers.cookie) { var session = req.headers.cookie.match(/__session_id=([^;:\s\n\r\t]+)/); if (session) user_session = session[1] } store.dispatch(setIp(user_ip)); store.dispatch(setSession(user_session)); var promise = []; if (session) { promise.push( new Promise(function(resolve, reject) { Request.fetch( '/api/user/getInfo', { success: user => { resolve(user); }, error: error => { reject(error); }, cache: false, remote_ip: user_ip, session: user_session, }); }) ); } Promise.all(promise) .then(user => { if (typeof user != 'undefined' && user.length && user[0].id) { store.dispatch(userLogin(user[0])); } match({routes: routes(store), location: req.url}, (error, redirect, render_props) => { if (redirect) { store = null; return res.redirect(301, redirect.pathname + redirect.search); } if (error) { store = null; return res.status(500).end('Internal server error'); } if (!render_props) { store = null; return res.status(404).end('Not found') } // parse lang var lang = getUserLang(req); // dispatch lang into store store.dispatch(setLang(lang)); // Set lang (if components needed) Lang.setLang(lang); // get current location var loc = getLocation(req) // dispatch location info store store.dispatch(setLocation(loc)); // make fetch params var fetch_params = makeFetchParams( req, loc, render_props.params ); // fetch components data (if needed) fetchComponentsData( store, render_props.components, fetch_params ) .then(() => { // set lang Lang.setLang(lang); // make component return ReactDOM.renderToString( <Provider store={store}> <RouterContext {...render_props} /> </Provider> ) }) .then(html => { // make HTML response return renderHTML(html, store.getState(), !old_browser); }) .then(html => { // send HTML response // console.log('done', store.getState()); store = null; res.set({ 'Content-Type': 'text/html; charset=utf-8', 'Content-Length': html.length, 'ETag': '' }); res.status(200).end(html); }) .catch(err => { // catch error store = null; console.log(err); res.status(500).end('Internal server error'); }) }); }) .catch(err => { store = null; console.log(err); res.status(500).end('Internal server error'); }); });