我一直试图回答所有这些问题的答案,但未能将它们应用到我的代码中。我明白发生的事情是,在我使用错误响应呈现页面之前,已经向用户发送了另一个响应。另一方面,我不知道如何解决这个问题。
以下是我在脚本中抛出错误的方法:
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();
};
这是一个有点增强的快速错误处理程序:
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有点新意,所以有点难以抓住这个令人困惑的面向事件的编程:)
提前谢谢!
答案 0 :(得分:1)
最可能的问题在于:
if (!player) {
next(new HttpError(404, "Player not found")); // HttpError(status, message)
}
在next()调用前面返回一个返回值。
如果没有返回,将调用下一个函数,但路由处理程序也将继续执行。您可能有一个看起来像这样的处理程序:
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,您将获得“无法设置处理程序错误”。
更有可能首先调用res.send函数,并在您的快速错误处理程序中引发错误。