窗口未使用服务器端渲染React和Express定义

时间:2017-11-13 16:00:22

标签: reactjs redux react-redux serverside-rendering react-router-dom

请注意,我正在使用Turbo360,您可以在https://www.turbo360.co/找到更多相关内容,但我向您保证,它与其工作方式完全一致,因此错误并非来自此处。

我已经和一些人谈过了,而且从我收集到的内容来看,这个错误来自我打电话cont initialState = window.INITIAL_STATE;的入口点。

当我在服务器端点击我的后端路由时会触发此错误。然而,路由本身在后端确实成功了,我的意思是,如果我要记录数据,我会让用户重新获得成功。

然而,在前端我得到了这个: enter image description here

我会尽量不要弄乱这一点,所以你必须对SSR有一些了解。 SSR部分工作正常,直到我的后端快速路线。所以除非有必要添加代码,否则我会将代码保留在那些代码中。

反应切入点:

import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import { BrowserRouter } from 'react-router-dom';
import { renderRoutes } from 'react-router-config';

import store from './stores';
import routes from './routes';

const initialState = window.INITIAL_STATE; //WHERE I BELIEVE ERROR IS COMMING FROM

ReactDOM.hydrate(
  <Provider store={store.configure(initialState)}>
    <BrowserRouter>
      <div>{renderRoutes(routes)}</div>
    </BrowserRouter>
  </Provider>,
  document.getElementById('root')
);

服务器入口点:

require('babel-core/register')({
  presets: ['env', 'react', 'stage-0', 'stage-1']
});

const pkg_json = require('./package.json');
const vertex = require('vertex360')({ site_id: pkg_json.app });
var renderer = require('./renderer.js');

// initialize app
const app = vertex.app();

// import routes
const index = require('./routes/index');
const api = require('./routes/api');
const users = require('./routes/users');

// set routes
app.use('/api/users', users);

// hopefully will be used on every Route, this should handle SSR RR4
app.use(renderer);

module.exports = app;

服务器端用户注册路由:

router.post('/register', (req, res) => {
  const body = req.body;

  if (body.username.length == 0) {
    res.json({
      confirmation: 'fail',
      message: 'Please enter an username address.'
    });

    return;
  }

  if (body.password.length == 0) {
    res.json({
      confirmation: 'fail',
      message: 'Please enter a password.'
    });

    return;
  }

  turbo
    .createUser(body)
    .then(data => {
      res.json({
        confirmation: 'success',
        user: data
      });
    })
    .catch(err => {
      res.json({
        confirmation: 'fail',
        message: err.message
      });
    });
});

动作:

axios.post('/api/users/register', params)
  .then(response => { console.log(response.data });
  .catch(err => { console.log(err); });

1 个答案:

答案 0 :(得分:2)

查看代码应该完成的第一个修复是

cont initialState = typeof window !== "undefined" && window && window.INITIAL_STATE;.

这应该理想地解决窗口未定义的问题。 因为在执行SSR时,窗口对象将不存在,因为它是浏览器级别的对象。