Получение этой ошибки при использовании маршрутизатора React TypeError: type.toUpperCase не является функцией

Я разрабатываю изоморфное приложение, используя react и express.js. Я использую React Router для маршрутизации на стороне клиента. При запуске приложения я получаю следующие ошибки и предупреждения в консоли

Предупреждение: ошибка propType: недопустимый реквизит handler типа object указан для Route, ожидаемый function.

Предупреждение. Недопустимый неопределенный handler типа object указан для UnknownComponent, ожидается function.

TypeError: type.toUpperCase не является функцией

Вот код для components/main.jsx

var React = require('react');
var Counter  = require('./flashCard.js');
var RouterModule = require('react-router');
var RouteHandler = require('react-router').RouteHandler
var routes = require('./routes.js')
var APP = React.createClass({
  render: function() {
    return (
      <html>
        <head>
          <title>8 facts</title>
          <link rel="stylesheet" type="text/css" href="/stylesheets/style.css"/>
          <script src="/javascripts/bundle.js"></script>
        </head>
        <body>
         <RouteHandler/>
        </body>
      </html>
    );
  }
});

module.exports = APP;

if(typeof window !== 'undefined') {
  window.onload = function() {

      RouterModule.run(routes,RouterModule.HistoryLocation, function (Handler) { 
        React.render(<Handler/>, document);
      });
}
}

Вот код для components/routes.jsx

var React = require('react');
var Route = require('react-router').Route
var Counter = require('./flashCard.js');
var App = require('./main.js')
var Demo = require('./demo.js')

var routes = (

    <Route name="home" handler={App}>
        <Route path="/" handler={Counter}/>
        <Route path="/demo" name ="demo" handler={Demo}/>
    </Route>

);

module.exports = routes;

Вот код рендеринга на стороне сервера. app.js

var express = require('express');
var http = require('http');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
require('node-jsx').install();
var db = require('./models/schema.js');
var mongoose = require('mongoose');
var app = express();
var React = require('react');
var RouterModule = require('react-router')
var routes = require('./components/routes.js')
var posts = require('./routes/index.js');

//database
db.connectDB().then(function(){
            console.log('connected');
          }, function(err){
            console.log('error');
          });
//database

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(favicon());
app.use(logger('dev'));
app.use( bodyParser.json() );       // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({     // to support URL-encoded bodies
    extended: true
}));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));


app.use('/posts', posts);

//server side rendering code
    app.use(function(req, res) {
      RouterModule.run(routes, req.path, function(Handler) {
        var Html = React.createElement(Handler);
        res.send(React.renderToString((Html)));
      });
    });

person kishan    schedule 25.07.2015    source источник


Ответы (5)


Во-первых, похоже, что вы используете 0.13.3 React Router. Это нормально, и это самая последняя стабильная версия, но я предлагаю вам взглянуть на переход на 1.0.0-beta 3. API сильно изменился между ними, я думаю, к лучшему.

Что касается ошибки, которую вы получаете, это означает, что вы передаете объект, который на самом деле не является компонентом, когда вы ссылаетесь на <Handler />. Часто это происходит, когда вы забыли потребовать компонент или использовать module.exports в самом компоненте. В документах для 0.13.3 похоже, что они используют компонент <Root /> там, где вы использовали <Handler />. Может попробовать переключиться на <Root />? Или, если вы каким-то образом переименовываете <Root /> в <Handler /> в другом файле, посмотрите там, нет ли у вас проблем.

Или просто переключитесь на 1.0.0-beta3. Это намного приятнее.

person hmlee    schedule 25.07.2015

Когда я столкнулся с этой проблемой, это произошло потому, что я забыл установить экспорт модуля в свой компонент.

module.exports = <component-name>;
person Zack    schedule 03.02.2016

Я столкнулся с этим раньше. Скорее всего синтаксическая ошибка в вашем компоненте.

person David Lin    schedule 27.07.2015
comment
Я не могу понять, где ошибка в компонентах.. все вроде хорошо... - person kishan; 27.07.2015

Если вы все еще не нашли ответ, попробуйте изменить res.send(React.renderToString((Html))); на res.send(React.renderToString(<Handler/>);, надеюсь, это поможет! ваше здоровье.

person Rei Dien    schedule 29.07.2015

Я столкнулся с той же проблемой. Он ожидает Javascript и получает JSX. Поэтому вам нужно преобразовать его перед вызовом React.renderToString().

Включите babel через npm, а затем вы можете просто добавить require('babel-core/register'); вверху server.js.

person Ojassvi Chawla    schedule 25.11.2015