保留node.js中的堆栈跟踪

我想在处理来自net.js的错误时保留调用堆栈。

下面的例子工作,但要求我为每个不是最优的调用预分配一个错误对象。

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

有没有什么办法可以预先把我从函数的上下文中创build一个错误得到的堆栈添加到从套接字获得的错误中,而不必事先创build一个错误对象?

new Error()调用点上,您必须先获取堆栈跟踪。 您不必创build实际的Error对象; 您也可以使用V8堆栈跟踪API来执行此操作:

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

现在堆栈可用作stackHolder.stack

V8懒惰格式的堆栈,所以这不像你想象的那么昂贵; 该stack属性实际上是一个属性getter,它第一次运行格式化工作,然后用输出replace自己。 (从上面链接的文档中可以看出:“为了效率,堆栈跟踪在被捕获时不是格式化的,而是根据需要,第一次访问堆栈属性。”)

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