我在server.js文件中有这个快速的js代码:
var express = require('express');
var app = express();
var fs = require('fs');
var publicdir = __dirname + '/client';
app.set('port', 8080);
app.use(function(req, res, next) {
if (req.path.indexOf('/js/') === -1 && req.path.indexOf('/css/') === -1) {
if (req.path.substr(-1) === '/') {
req.url = req.url.slice(0, -1) + '.html';
} else {
res.redirect(301, req.url + '/');
}
}
next();
});
app.use(express.static(publicdir, {
extensions: ['html', 'htm']
}));
我正在尝试使网址呈现一致,以便在每个网址的末尾都有一个尾随的“/”。虽然上面的代码工作,我不断收到我的日志文件中的错误消息:
Error: Can't set headers after they are sent.
此错误来自这样的网址格式:
http://www.myserver.com/my-page-name
但它确实正确地将尾部“/”添加到结尾。
如何更改上述代码以消除该日志错误?
答案 0 :(得分:2)
调用res.redirect()
后,请不要调用next()
,因为这样可以让您的其他路由处理程序处理URL,从而导致出现错误消息,因为两个路由处理程序都尝试发送响应。
将中间件处理程序代码更改为此代码(保留代码的其余部分):
app.use(function(req, res, next) {
if (req.path.indexOf('/js/') === -1 && req.path.indexOf('/css/') === -1) {
if (req.path.substr(-1) === '/') {
req.url = req.url.slice(0, -1) + '.html';
} else {
// redirect to add the slash, do not continue routing
res.redirect(301, req.url + '/');
return; // returning here will skip the call to next() below
// so there will be no additional routing
}
}
// continue routing if we get here
next();
});
我们的想法是,您希望在不发出next()
的所有代码路径中调用res.redirect()
,但不能在任何代码路径中调用private Array sections;
。