【问题标题】:Why am I getting match is not a function when it is clearly defined?为什么我得到明确定义的 match 不是一个函数?
【发布时间】:2017-02-18 01:09:20
【问题描述】:

我正在服务器上渲染我的 React 应用程序,但我收到此错误 TypeError: match is not a function。我不知道如何解决这个问题或这个错误意味着什么,因为 react-router 文档说其他方式。

var routes = require('./public/src/routes');
var React = require('react');
var renderToString = require('react-dom/server');
var match = require('react-router');
var RouterContext = require('react-router');

app.get('*', (req, res) => {
  match(
    { routes, location: req.url },
     (err, redirectLocation, renderProps) => {
       if (err) {
        return res.status(500).send(err.message);
      }
      let markup;
      if(renderProps) {
        markup = renderToString(React.createElement(RoutingContext, renderProps));
      }
      return res.render('index', { markup });
     }
  )
})

【问题讨论】:

  • 您在哪里看到match 在这里导入? npmjs.com/package/react-router 在文档中很明显react-router 没有导出函数。另请查看var match = require('react-router'); var RouterContext = require('react-router');。似乎您期望 require('react-router') 在每次调用它时返回不同的值。那没有意义。 require('react-router') 将始终返回相同的值。

标签: node.js reactjs react-router


【解决方案1】:

您将match 分配给模块react-router 本身,这不是一个函数,也不是您想要做的。 match 是模块的部分,而不是模块本身。 RouterContext 也是如此。你要做的是:

var match = require("react-router").match;
var RouterContext = require("react-router").RouterContext;

这需要正确的模块并将match 正确分配给模块中的函数。 RouterContext 也是如此。或者,使用 ES6 的新解构赋值(等效):

var { match, RouterContext } = require("react-router");

【讨论】:

  • @joethemow 另请注意,解构赋值是 ES6 中的新事物。您的配置可能不支持它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
  • 2012-05-01
  • 1970-01-01
  • 2019-02-05
  • 1970-01-01
相关资源
最近更新 更多