如何在Node.js中调试发送的标头错误

3

我遇到了很多“Can't set headers after they are sent”错误,但是它们从来没有在我的‘app.js’中给出行号,这正常吗?人们如何调试这些错误?

导致报错的代码如下,它是否隐藏了行号?

app.get('/', function(req, res, next) {
    if (req.param('q')) {
        searchProvider.search(
            req.param('q'),
            function( error, results) {
                res.render('search', {
                    locals: {
                        results: results,
                        q: req.param('q')
                    },
                });
            }
        );
    } else {
        res.render('index');
    }
});

您可能在编写头信息后调用了 res.send。 - Tom
1个回答

8

无法在发送后设置头

这是一个常见的错误,意味着您基本上调用了res.renderres.end或者res.send多次。这意味着您正在尝试为一个HTTP请求写入多个HTTP响应(这是无效的)。

这个错误的常见原因是在一个中间件中两次调用next

也许您有一段类似于以下的中间件代码:

app.all("*", function(req, res, next) {
  // not logged in
  if (!req.user) {
    res.render("loginError");
  } 
  // bad accidental next call!! Will call next after rendering login error
  next();
});

我应该调用某些东西而不是 next() 吗?比如 return - benui
@BenHumphreyo 要么使用 return res.render(...),要么加上 else { next() } 就可以解决这个问题。 - Raynos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接