当URL包含尾部反斜杠时,使用快速和静态中间件节点崩溃

时间:2012-01-07 01:05:51

标签: node.js connect express

我有一个简单的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,但我想弄清楚我是否在这里遗漏了一些内容。谢谢!

1 个答案:

答案 0 :(得分:1)

这种行为的原因似乎是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,并且不会调用下一个中间件处理程序。

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

由于函数以不同的方式处理反斜杠,因此除了使用一些中间件来过滤掉这些请求之外,你无法做任何事情。