错误:Can't在发送后设置头-Node.js
Error: Can't set headers after they are sent - 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();
};
这是一个稍微增强的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错误处理程序中引发。
相关文章:
- 无法在数据endVal中设置值=“”;{{ucount}}”;使用Angular JS的CountUp
- 使用 js 将背景图像设置为 HTML
- jQuery在MVC应用程序中设置JS变量
- 从 HTM 中设置 JS 函数的变量
- htaccess设置js的过期时间
- 使用 PHP var 和 AJAX 设置 JS var
- 要在 D3 中使用的 JSON 文件中的格式设置.js
- 区域设置 JS 的货币代码
- 为什么控制台在原型中将 e.explicitOriginalTarget.value 显示为在粘贴或剪切事件上设置.js
- 如何设置js加载顺序
- 如何从Drupal6安装中取消设置js文件:不´t与“;删除脚本[]”;在我的模板文件中
- 如何在正确的时间设置JS事件
- 如何在后台bean管理的进度条上设置JS效果
- JS:创建输入类型文件多个,并设置JS数组作为值
- 在express/jade文件中设置JS和CSS路径的正确方法是什么?
- 如何设置js函数滚动让它不超过父元素的底部
- 在RAILS 3.1中设置js资产的Cache Control头
- Joomla - 如何使用用户在模板参数中提供的信息从头部取消设置 JS 文件
- 我如何设置JS在后台运行,同时保持不显眼
- 如何设置JS客户端来执行远程API请求