我一直在尝试调试我的 Node 应用程序以在我的日志中找到错误的来源,该错误仅显示为“错误:发送后无法设置 header
”,其中没有跟踪信息或任何上下文。
碰巧,我想我现在已经解决了这个问题……我正在使用 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);
但尽管如此,我仍然只收到“错误:发送后无法设置 header
”,而没有任何上下文。这是因为此控制台错误消息是在外部库(如 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('error in function abc: ' + err + ' whilst doing xyz');
而在其他地方我使用了类似下面的东西,只是将错误消息的片段作为单独的参数传递给 console.log
:
console.log('error in function xyz:', err, 'whilst doing abc');
我现在看到这些给出了不同的结果!
前者必须将 err
字符串化,以便它可以与消息的其他部分连接起来,并且根据 this ,在这样做时它只使用消息部分。
但是,在后一种形式中,err
对象必须由 console.log
原封不动地处理,并作为一个整体转储。
这解释了为什么有时我没有像我预期的那样看到错误的全部内容,而有时我却看到了。
至于其他库放在那里的控制台日志消息,还需要检查的是您没有在日志查看器中过滤掉日志消息的“堆栈”部分……结果是我 (为了节省日志配额...我正在使用 papertrail)...d'oh。我这样做是通过过滤掉以 ____at
(四个空格后跟“at”)开头的任何行,例如 ____at Request.self.callback
。
关于javascript - 如何在 node.js 中使用堆栈跟踪记录错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42528677/