Express.js,意外的令牌 <

Posted

技术标签:

【中文标题】Express.js,意外的令牌 <【英文标题】:Express.js, Unexpected token < 【发布时间】:2016-12-09 03:45:10 【问题描述】:

我有一个简单的快递服务器,看起来像这样:

Epxress 应用程序:

var express = require('express');
var compression = require('compression');
var path = require('path');
var cors = require('cors');
var router = express.Router();

var app = express();

app.use('/bundle', express.static(path.join(__dirname, '/bundle')));

app.enable('trust proxy');

app.use(compression());

app.get('*', function(req, res) 
    res.header('Cache-Control', "max-age=60, must-revalidate, private");
    res.sendFile( path.join(__dirname, 'index.html') );
);


var server = app.listen(process.env.PORT || 5000, function () 
    var host = server.address().address;
    var port = server.address().port;
    console.log(`Example app listening at http://%s:%s`, host, port);
);

还有简单的html文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>React Router test</title>
</head>
<body>
    <div id="root"></div>
    <script src="bundle.js"></script>
</body>
</html>

在 bundle.js 内部,我有带有客户端路由的 ReactJS 应用程序:

render((
    <Router history=browserHistory>
        <Route path="/" component=App>
            <Route path="about" component=About />
            <Route path="about2" component=About2 />
            <Route path="about3" component=About3 />
            <Route path="*" component=NoMatch />
        </Route>
        <Route path="*" component=NoMatch />
    </Router>
), document.getElementById('root'));

每当我尝试导航到 domain:port/(路由器支持此路由)时,一切正常。 但是当我尝试导航到更复杂的 URL 时,例如 domain:port///.. 等,我在浏览器中遇到错误:

bundle.js:1 Uncaught SyntaxError: Unexpected token <

看起来不像使用 index.html 从静态服务器响应发送 bundle.js 而在 bundle.js 内部有 html 标记。

我该如何解决这个问题?

谢谢!

【问题讨论】:

试试 @Utro 为我工作。谢谢! @KokovinVladislav 谢谢,它适用于我的情况 【参考方案1】:

似乎发生了环回,因为* 规则每次都服务于index.html,而当未找到bundle.js 时,它将服务index.html,从而尝试解析&lt;作为 javascript

一种index-ception如果你愿意的话......

【讨论】:

【参考方案2】:

第 1 步

文件夹结构:

public

   -> index.html

   -> bundle.js

第 2 步

像这样配置静态路径

app.use(express.static('public'))

第 3 步

确保它是否配置正确。转到浏览器并直接访问您的js文件

localhost:3000/bundle.js

如果您看到您的 javascript ...Hurray。如果没有,则与第 2 步战斗,然后检查第 3 步

第 4 步

在脚本标签中使用相同的路径

<script src="/bundle.js" type="text/javascript"></script>

【讨论】:

【参考方案3】:

我通过添加以下行解决了同样的问题:

app.use(express.static(path.join(__dirname, "public")));

【讨论】:

【参考方案4】:

简单地说从 index.html 的 中删除 DOT,子路由就可以工作了!因为 express 总是会找到带有 * catch all route 的捆绑包

我的修复在。我的仓库,检查一下:https://github.com/nickjohngray/staticbackeditor

要了解为什么以及如何执行此操作,请继续阅读:

修复方法是在 webpack 输出脚本标签时告诉 webpack 将包的路径设为绝对路径(而非相对路径),以便在 webpack.config 中设置 publicPath '/' (root) 和文件名 'bundle .js' ,然后 HtmlWepackPlugin 将嵌入脚本标签,如

<script src="/bundle.js">

这就是我们想要的!

不是

<script src="./bundle.js">

这是我的 webpack.config 的 sn-p 以允许子路由

 entry: ['babel-polyfill', './src/client/index.tsx'],
    output: 
       path: path.join(__dirname, outputDirectory),
       filename: 'staticbackeditor.js',
       publicPath: '/'
    

如果路径是相对的,这里是一个流程示例:like

<script src="./bundle.js">  

错了!杀死“.

环境

后端是 express server,bundle.js 和 index.html 文件在 public static dist 文件夹中

Express 为所有使用 * 的请求提供了一条包罗万象的路由,该路由为 index.html 文件提供服务,例如

app.use('*', (req, res) => 
   res.sendFile(path.resolve('dist', 'index.html'))
)

Index.html 文件有这个脚本标签(注意 . 使这个路径相对)

<script src="./bundle.js"></script>

步骤

用户请求页面/编辑路线

Express 回馈 index.html 文件

Web 浏览器读取此文件

浏览器找到脚本标签

浏览器请求获取路径为 ./bundle.js 的脚本

Express 在静态文件夹中查找此文件

没有找到,

所以它在触发捕获所有路由时再次返回 index.html

BANG 网络浏览器报错。

所以服务器返回 index.html 而不是 bundle.js 发生这种情况是因为 catch all 路由运行 sine express 没有找到 bundle.js 在文件夹中编辑。

正确的流动 现在!如果我们将 html 文件脚本的源代码更改为绝对路径,那么无论用户在哪个路径上,express 都会找到它

用户请求页面/编辑路线 Express 回馈 index.html 文件 Web 浏览器读取此文件 浏览器找到脚本标签 浏览器请求获取路径为 /bundle.js 的脚本 (注意上面的.不见了!) Express 在静态文件夹中查找此文件 它找到了, 所以它返回 bundle.js 砰!子路线有效!

【讨论】:

github链接坏了:(

以上是关于Express.js,意外的令牌 <的主要内容,如果未能解决你的问题,请参考以下文章

Express.js csrf 令牌与 jQuery Ajax

如何在 express.js/passport-http-bearer 中撤销 express-jwt 令牌

reactjs意外的令牌'<'

用户在express js中登录时如何更新令牌?

Reactjs:意外的令牌'<'错误

反应意外的令牌 <