错误:发送后无法设置标头 – Node.js

我一直在试图解决这个问题的所有答案,但是没有把它们应用到我的代码中。 我明白发生了什么事情之前,我提出的错误响应的页面,另一个响应已发送给用户。 另一方面,我不知道如何解决这个问题。

这里是我如何在脚本中抛出一个错误:

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(); }; 

这是一个增强的快速error handling程序:

 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 ++的节点和js有点新奇,所以抓住这个令人困惑的面向事件的编程有点困难:)

先谢谢你!

最可能的问题在于:

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

在下一个()调用之前放置一个返回值。

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

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

下一个函数被调用,你的error handling程序。 也许它写了一个回应给客户。 然后在您的处理程序中调用正常的res.send,并得到“无法设置处理程序错误”。

更有可能res.send函数首先被调用,错误将在您的快速error handling程序中引发。