【问题标题】:Next.js, Redux app works perfectly fine on localhost but not working on production serverNext.js,Redux 应用程序在 localhost 上运行良好,但不能在生产服务器上运行
【发布时间】:2019-09-11 18:33:48
【问题描述】:

当我在服务器上构建并启动应用程序时,我收到此错误。这似乎与 Redux 有关。

{ 不变违规:在“Connect(Form(LoginForm))”的上下文中找不到“store”。要么包裹根 中的组件,或者将自定义的 React 上下文提供程序传递给连接选项中的 Connect(Form(LoginForm)) 并将相应的 React 上下文使用者传递给。


// createStore.js

import Immutable from 'immutable'
import thunkMiddleware from 'redux-thunk'
import { createLogger } from 'redux-logger'
import { createStore, applyMiddleware, compose } from 'redux'

import config from 'config'
import rootReducer from './reducers/index.js'

function createMiddlewares ({ isServer }) {
  let middlewares = [
    thunkMiddleware
  ]

  if (config.env === 'development' && typeof window !== 'undefined') {
    middlewares.push(createLogger({
      level: 'info',
      collapsed: true,
      stateTransformer: (state) => {
        let newState = {}

        for (let i of Object.keys(state)) {
          if (Immutable.Iterable.isIterable(state[i])) {
            newState[i] = state[i].toJS()
          } else {
            newState[i] = state[i]
          }
        }

        return newState
      }
    }))
  }

  return middlewares
}

function immutableChildren (obj) {
  let state = {}
  Object.keys(obj).forEach((key) => {
    state[key] = Immutable.fromJS(obj[key])
  })
  return state
}

export default (initialState = {}, context) => {
  let { isServer } = context
  let middlewares = createMiddlewares({ isServer })
  let state = immutableChildren(initialState)

  return createStore(
    rootReducer,
    state,
    compose(applyMiddleware(...middlewares))
  )
}

// _app.js

import withRedux from 'next-redux-wrapper'
import { withRouter } from 'next/router'
import { Provider } from 'react-redux'
import App, { Container } from 'next/app'
import { checkForPopup } from "./helpers/popup.js";
import createStore from './redux/createStore.js'

class MyApp extends App {
  static async getInitialProps ({ Component, ctx }) {
    return {
      pageProps: Component.getInitialProps
        ? await Component.getInitialProps(ctx)
        : {}
    }
  }
  render() {
    const { Component, pageProps, store, router } = this.props
    return (
      <Container>
        <Provider store={store}>
          <Component router={router} {...pageProps} />
        </Provider>
      </Container>
    );
  }
  componentDidMount() {
    checkForPopup();
  }
}

export default withRedux(createStore)(
  withRouter(MyApp)
)

【问题讨论】:

  • 嗨,博兹,请问您找到解决此问题的方法了吗?我有同样的问题
  • 我终于发现了错误。当我构建应用程序并使用 yarn start 运行时,我遇到了同样的错误,但是当我使用 express 服务器运行时,我没有任何问题
  • 我也有同样的问题,有什么解决办法吗?

标签: redux react-redux redux-thunk next.js server-side-rendering


【解决方案1】:

根据@wamba-kevin 的评论,在生产环境中运行 express 时,您需要在启动脚本前加上 NODE_ENV=production。我对 next 做了同样的事情,它奏效了。

【讨论】:

    猜你喜欢
    • 2020-08-21
    • 2015-06-27
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2013-06-08
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多