【发布时间】:2017-07-20 14:24:21
【问题描述】:
我一直在尝试调试我的节点应用程序以在我的日志中查找错误的来源,该错误仅显示为“Error: Can't set headers after they are sent”,没有任何跟踪信息或任何上下文。
碰巧,我想我现在已经解决了这个问题...我正在使用connect-timeout,并且我正在继续处理传递给异步网络操作的回调,该回调最终会尝试执行res.send(),尽管req.timedout 在网络运行期间被connect-timeout 设置为“true”。
但我仍然不明白为什么我的日志没有显示此错误的跟踪信息。在我的代码中返回错误的任何地方,我都会将其记录到控制台:
console.log(err);
如果err 对象中有可用的跟踪信息,并且这似乎放在err.stack 中,上述语句不应该转储err 的全部内容(包括err.stack) 到控制台日志?我的理解是,通过执行上述操作,我不会丢失任何信息,例如到:
console.log(err.stack);
但this one 之类的帖子似乎另有说明(尽管链接的帖子现已更新)。
我其实更进一步,添加一些相关的文字来帮助定位错误:
console.log('error in dodgyFunction:', err);
但尽管如此,我仍然只得到“Error: Can't set headers after they are sent”,没有任何我会说的上下文。这是因为此控制台错误消息是在外部库(如express)中输出的吗?我认为外部库应该将错误发送回主代码以进行相应处理?
编辑:这是我将错误和超时检查放在传递给异步操作的回调函数顶部的示例:
var execFile = require('child_process').execFile;
execFile('dodgycommand', options, function(error, stdout, stderr) {
if (req.timedout) {
console.log('timeout detected whilst running dodgycommand, so aborting...');
return;
}
if (error) {
console.log('error running dodgycommand:', error);
res.sendStatus(400);
return;
}
// ... it's safe to continue ...
}
我基本上始终遵循相同的模式。
【问题讨论】:
-
你的
console.log()声明放在哪里? -
@JyotmanSingh 我已经更新了我的问题,以举例说明我将
console.log()语句放在哪里 -
好消息,您可以找到问题!现在,为了更好地帮助未来的读者(并遵循 Stack Overflow 规则),您可以从问题中删除 EDIT2 消息并将其作为答案发布。之后,将您的答案标记为正确答案。
-
回答我自己的问题似乎是错误的,但我现在已经这样做了!
-
顺便说一句,您应该考虑使用
console.error而不是console.log以便它记录到 std:err
标签: javascript node.js error-handling console.log