我的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(),而不是在所有发出此代码的路径中调用。

09-25 16:03