错误:Can't在发送后设置头-Node.js

Error: Can't set headers after they are sent - Node.js

本文关键字:设置 js -Node Can 错误      更新时间:2023-09-26

我已经尝试过这个问题的所有答案,但未能将它们实现到我的代码中。据我所知,在我用错误响应呈现页面之前,已经向用户发送了另一个响应。另一方面,我不知道如何解决这个问题。

以下是我如何在脚本中抛出错误:

if (!player) {
      next(new HttpError(404, "Player not found")); // HttpError(status, message)
    }

要将此错误发送给用户,我使用sendHttpError.js方法,该方法如下:

module.exports = function(req, res, next){
    res.sendHttpError = function(error){
        if(res.req.headers['x-requested-with'] == 'XMLHttpRequest'){
            res.json(error);
        }else {
            res.render("error", {error: error});
        }
    };
    next();
};

这是一个稍微增强的express错误处理程序:

app.use(function (err, req, res, next) {
    if(typeof err == 'number'){
      err = new HttpError(err);
    }
    if(err instanceof HttpError){
      res.sendHttpError(err);
    } else{
      if(app.get('env') == 'development'){
        res.status(err.status || 500);
        res.render('error', {
          message: err.message,
          error: err
        });
      } else {
        log.error(err);
        err = new HttpError(500);
        res.sendHttpError(err);
      }
    }
  });

我对来自C++的node和js有点陌生,所以很难理解这种令人困惑的面向事件的编程:)

提前谢谢!

问题很可能就在这里:

if (!player) {
  next(new HttpError(404, "Player not found")); // HttpError(status, message)
}

在next()调用前面放一个return。

如果没有返回,将调用下一个函数,但路由处理程序也将继续执行。你可能有一个处理程序,看起来像这样:

app.get('/foo', function(req, res, next){
    if (!player) 
      next(new HttpError(404, "Player not found")); // HttpError(status, message)
     res.send({res:'ok'});
});    

将调用下一个函数和您的错误处理程序。也许它会给客户端写一个响应。然后在处理程序中调用正常的res.send,并得到"Can't set handler error"。

更有可能的是,res.send函数首先被调用,并且错误将在您的express错误处理程序中引发。