语法错误:使用renderToString(<RoutingContext {... renderProps} />时出现意外令牌<

吉加尔·in那

我正在尝试使用React和React-router进行服务器端渲染。到目前为止,它只是来自各种来源的复制粘贴代码。但是,当我尝试使用node运行应用程序时,出现语法错误(不是运行时错误)。下面是代码

App.js

'use strict';
require('babel/register');

const express        = require('express');
const http           = require('http');
const handlebars     = require('express-handlebars');
const renderToString = require('react-dom').server;
const match          = require('react-router').match;
const RoutingContext = require('react-router').RoutingContext;
const Routes         = require('./routes');
const app            = express();
var server;

// JSX transpilation
require('node-jsx').install();

// Setting up handlebars
app.engine('.hbs', handlebars({
    extname: '.hbs',
    layoutsDir: 'views/server',
    partialsDir: 'views/server/partials'
}));

app.set('view engine', '.hbs');

// Mount Routes
app.use('*', function (req, res) {
    match({routes: routes, location: req.url}, (error, redirectLocation, renderProps) => {
        if (error) {
          res.status(500).send(error.message)
        } else if (redirectLocation) {
          res.redirect(302, redirectLocation.pathname + redirectLocation.search)
        } else if (renderProps) {
            console.log(renderProps);
            var pageData = {
                serverHtml: renderToString(<RoutingContext {...renderProps} />)
            };
            console.log(pageData);
            res.render('base', pageData);
        } else {
          res.status(404).send('Not found')
        }
    });
});

server = http.createServer(app);

server.listen('3000', () => {
    console.log('Express server listening on port ' + 3000);
});

我在运行时遇到的错误node --harmony app.js

serverHtml: renderToString(<RoutingContext {...renderProps} />)
                                       ^
SyntaxError: Unexpected token <
    at exports.runInThisContext (vm.js:73:16)
    at Module._compile (module.js:443:25)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
    at startup (node.js:129:16)
    at node.js:814:3

我是否需要安装/转换(babelify / jsx)代码来处理JSX样式标签?但是我没有在任何在线教程中找到任何类似的东西。

我关注的资源

  1. React-router(服务器端渲染)
  2. React的服务器端渲染
吉加尔·in那

注意-不建议使用此方法。还有更好的选择。如前所述,require('node-jsx').install()不再维护&使用babel是前进的理想方法。

因此,我通过对上述代码进行了少量更改来解决了该问题

我删除了以下行,因为它不是必需的

require('babel/register');

然后,我没有通过babel来转译app.js,而是使用React.createElement()更改了JSX标签,如下所示:

//serverHtml: renderToString(<RoutingContext {...renderProps} />)
serverHtml: ReactDOM.renderToString(React.createElement(RoutingContext, renderProps))

完整的更新代码如下:

'use strict';

const compression    = require('compression');
const express        = require('express');
const http           = require('http');
const handlebars     = require('express-handlebars');
const path           = require('path');
const React          = require('react');
const ReactDOM       = require('react-dom/server'); // Fixed this
const match          = require('react-router').match;
const RoutingContext = require('react-router').RoutingContext;
const app            = express();
var server;

require('node-jsx').install(); // Not required if you convert the below './routes' file from JSX into js
const Routes = require('./routes');

// Used for Gzipping all the resources
app.use(compression());

// Setting up handlebars
app.engine('.hbs', handlebars({
    extname: '.hbs',
    layoutsDir: 'views/server',
    partialsDir: 'views/server/partials'
}));

app.set('view engine', '.hbs');

// Set path to public assets
app.use(express.static(path.join(__dirname, 'public')));

// Mount Routes
app.use('*', function (req, res) {
    match({routes:Routes, location:req.url}, (error, redirectLocation, renderProps) => {
        if (error) {
          res.status(500).send(error.message)
        } else if (redirectLocation) {
          res.redirect(302, redirectLocation.pathname + redirectLocation.search)
        } else if (renderProps) {
            var pageData = {
                serverHtml: ReactDOM.renderToString(React.createElement(RoutingContext, renderProps))
            };

            res.render('base', pageData);
        } else {
          res.status(404).send('Not found')
        }
    });
});

server = http.createServer(app);

server.listen('3000', () => {
    console.log('Express server listening on port ' + 3000);
});

谢谢 :)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

捆绑错误:语法错误使用React-native-android-wifi时出现意外令牌

Angularjs Flickr API语法错误:使用nojsoncallback = 1时出现意外令牌

Perl scipt:使用Expect模块生成bash命令时出现意外令牌的语法错误

Vue-loader语法错误:从js文件导入组件时出现意外令牌{

安装Yara时出现意外令牌附近的语法错误

使用ionic / cordova时出现意外的令牌错误

使用 Java 休眠时出现意外令牌错误

反应语法错误:在 = 处出现意外令牌

运行玩笑测试时出现意外的令牌导入错误

运行Jest测试时出现意外的令牌“导入”错误?

解析JSX文件时出现意外的令牌错误

C语言连接时出现意外的令牌错误

使用babel装饰器时出现意外令牌@

使用变量构建对象数组时出现意外令牌

使用Pug模板时出现意外的令牌“缩进”

使用地图时出现意外令牌

使用 react-moralis 时出现意外的令牌“反应”

<?php上出现意外的令牌错误

代码中出现意外的令牌错误

Powershell中出现意外的令牌错误

Bazel - 令牌附近出现意外错误

使用`RoutingContext::json` 方法时如何设置响应状态代码?

从ajax调用函数时出现“语法错误:意外的令牌”

语法错误:node.js中出现意外的令牌非法

语法错误:反应项目中出现意外令牌

带有 React Hooks 的 If 语句中出现意外的令牌语法错误

错误:使用“ifelse”时出现意外的“=”

从HTML引用JS时出现意外的语法错误意外字符串?

寻找匹配的“”时出现意外的 EOF 语法错误:文件意外结束