我有一台简单的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/ind
或localhost: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.stat
和fs.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/