在node.js中保留堆栈跟踪

Preserve stack traces in node.js

本文关键字:堆栈 跟踪 保留 node js      更新时间:2023-09-26

当处理来自例如。net.js的错误时,我试图保留调用堆栈。

下面的例子可以工作,但需要我为每个调用预先分配一个错误对象,这不是最佳的。

function socketStuff(callback) {
  // ..
  var maybeError = new Error 'Socket error ';
  socket.on('error', function(error) {
    maybeError.message += error.message;
    callback(maybeError);
  });
}

是否有任何方法可以将我从在函数的上下文中创建错误到从套接字获得的错误的堆栈添加到堆栈中,而无需事先创建错误对象?

您必须在new Error()调用时预先获取堆栈跟踪。你不需要创建一个实际的Error对象;你也可以使用V8的堆栈跟踪API:

var stackHolder = {};
Error.captureStackTrace(stackHolder, nameOfCurrentFunction);

,现在堆栈作为stackHolder.stack可用。

V8延迟格式化堆栈,所以这并不像你想象的那么昂贵;stack属性实际上是一个属性getter,它第一次运行时做格式化工作,然后用输出替换自己。(来自上面链接的文档:"为了提高效率,堆栈跟踪在捕获时不会格式化,而是在需要时,第一次访问堆栈属性。")

只需使用现有的长堆栈跟踪库之一,例如这个