快递js,在所有网址上添加尾随“/”

时间:2017-09-29 23:36:23

标签: javascript node.js express

我在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

但它确实正确地将尾部“/”添加到结尾。

如何更改上述代码以消除该日志错误?

1 个答案:

答案 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;