错误:错误:发送后无法设置标头

时间:2017-02-16 18:52:23

标签: javascript node.js express

我正在使用express和node.js

目标:当用户转到/ index时,如果网址中有特定的跟踪代码,请将其重定向到/ welcome。函数redirectBasedReferrer基于跟踪代码进行重定向。

nawk

当代码到达redirectBasedReferrer并将用户重定向到/ welcome时,我收到错误:

  

/?promoid = SYBNM49C& mv = other:错误:错误:发送后无法设置标题。
  在ServerResponse.OutgoingMessage.setHeader(_http_outgoing.js:344:11)

2 个答案:

答案 0 :(得分:1)

此错误意味着您以某种方式设法在同一路径中返回两次响应。我不会立即明白这种情况发生在哪里,但我会说,向用户返回错误响应可能是有意义的,而不是仅返回false。但除此之外,也许你在其他地方有一些中间件错误地过早地向用户返回响应但没有结束进程,因此它继续尝试再次向用户返回响应并抛出错误。

编辑:

现在您已经更新了代码,我看到了错误。这一行:

if (!req.imsProfile && !this.redirectBasedReferrer(req, res, next)) {

会导致中间件潜在地重定向用户,但仍然继续使用索引路由,从而导致错误。

答案 1 :(得分:1)

最大的问题仍然是这里的阻止,但你需要更改其他一些代码。

if (!req.imsProfile && !this.redirectBasedReferrer(req, res, next)) {
    return this.about(req, res, next);
}

如上所述Sam,索引路径中的这一行将导致 redirectBasedReferrer 中间件中的重定向发送响应,以及正文中的 about 中间件if语句。实际上,索引中间件中的代码实际上也会通​​过此if块之后的行发送第三个响应:

res.render('spark', {
    analyticsURI: Settings.getSetting('analytics').siteCatalystScriptURI
});

使用快速中间件时,在发送响应时使用if- else 阻止更好的做法,这样您将始终发送一个响应或另一个响应,但不是多个。

if (!req.imsProfile ...) {
    ...
} else {
    res.render('spark', {
        analyticsURI: Settings.getSetting('analytics').siteCatalystScriptURI
    });
}

请注意上一代码块中的省略号。这些也是你需要改变的部分。

我认为redirectBasedReferrer不是作为中间件,而是作为独立函数更好地工作,该函数根据url中是否存在跟踪代码返回true或false。因此,如果将redirectBasedReferrer放入一个独立的函数中,该函数只接受req对象(这是您在函数内部检查的唯一对象),您可以在同一个块中使用它,如下所示:

if (req.imsProfile) {
    res.render('spark', {
        analyticsURI: Settings.getSetting('analytics').siteCatalystScriptURI
    });
} else if (this.redirectBasedReferrer(req)) {
    res.redirect('/welcome');
} else {
    res.redirect('/about');
}

注意,在这种情况下,redirectBasedReferrer会稍微修改一下你现在拥有的内容,所以它看起来像这样:

redirectBasedReferrer: function (req) {
    if (!req || !req.query) {
        return false;
    }
    var referringtrackingCode = req.query.promoid;
    if (!referringtrackingCode || referringtrackingCode != "SYBNM49C") {
        return false;
    }
    return true;
}