我有一台简单的Express服务器,正在提供一些静态文件。这是服务器:

var express = require('express');
var app = express.createServer();

// Configuration
app.configure(function() {
    app.use(express.bodyParser());
    app.use(express.staticCache());
    app.use(express.static(__dirname + '/public'));
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

// 404
app.get('*', function(req, res) {
    res.send('not found', 404);
});

app.listen(3000);


在我的公共目录中,我有一个名为index.html的文件。启动node app.js,然后浏览到localhost:3000/index.html,将显示预期的静态文件。导航到localhost:3000/indlocalhost:3000/ind\会显示404页面,如预期的那样。

但是,导航到localhost:3000/index.html\(注意尾随反斜杠)会使我的node服务器崩溃:

stream.js:105
      throw er; // Unhandled stream error in pipe.
        ^
Error: ENOENT, no such file or directory  '/home/bill/projects/app/public/index.html\'


为什么node服务器崩溃而不是仅提供404页崩溃?我以为既然文件不存在,静态中间件只会跳过它,然后将请求传递给路由。我通过创建一个自定义中间件来解决该问题,如果请求URL中存在尾部反斜杠,则该中间件将返回404,但是我想弄清楚是否在此处遗漏了某些内容。谢谢!

最佳答案

此行为的原因似乎是fs.statfs.createReadStream处理尾随反斜杠的方式不同。

当静态中间件中的字符串'path/to/public/index.html\\' is given to fs.stat被忽略时(在命令行上运行stat index.html\检查名为index.html的文件,您必须为stat index.html\\运行index.html\)。因此,fs.stat认为已找到该文件,因为它认为您正在请求index.html,因此不会调用下一个中间件处理程序。

后来,认为它在寻找fs.createReadStream的字符串is passed to index.html\。找不到该文件,并抛出错误。

由于函数对反斜杠的处理方式有所不同,因此您实际上不能做任何事情,只能使用一些中间件来过滤掉这些请求。

关于node.js - URL包含尾部反斜杠时,使用快速和静态中间件导致 Node 崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8766465/

10-16 20:58