我的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']
}));
我试图使URL始终呈现,以便在每个URL的末尾始终带有尾随的“ /”。虽然上面的代码有效,但我仍在日志文件中收到以下错误消息:
Error: Can't set headers after they are sent.
此错误来自这样的网址格式:
http://www.myserver.com/my-page-name
但是,它确实在末尾添加了正确的尾部“ /”。
如何更改上述代码以消除该日志错误?
最佳答案
调用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()
,而不是在所有发出此代码的路径中调用。