节点中的异步堆栈跟踪

Nic*_*lin 6 error-handling asynchronous node.js

我有点惊讶我没有被这个更多的咬,但是在另一个tick中执行的回调中创建的节点错误没有一个合理的堆栈跟踪.

例如

function base (cb)  {
  process.nextTick(() => {
    throw new Error("I am unhelpful")
  }, 1000)
}

function top (cb) {
  base(cb)
}

top(() => {})
Run Code Online (Sandbox Code Playgroud)

结果是:

Error: I am unhelpful
    at /Users/me/stacktrace.js:45:11
    at _combinedTickCallback (internal/process/next_tick.js:135:11)
    at process._tickCallback (internal/process/next_tick.js:180:9)
    at Function.Module.runMain (module.js:607:11)
    at startup (bootstrap_node.js:158:16)
    at bootstrap_node.js:575:3
Run Code Online (Sandbox Code Playgroud)

当来自执行异步操作的库的回调/保证中发生异常时,这尤其不好,因为没有简单的路径备份跟踪以查找有问题的代码.想象一下涉及控制器,一些帮助模块和第三方库的服务调用.

到目前为止,我的解决方案是为当前tick中的潜在故障情况创建一个错误,然后在出现错误时将其传递给它:

function base (cb)  {
  let potentialError = new Error('oh noes')
  process.nextTick((err) => {
    potentialError.message = err.message
    throw potentialError
  }, 1000)
}
Run Code Online (Sandbox Code Playgroud)

这给了我一个实际包含调用链的堆栈跟踪:

Error: oh noes
    at base (/Users/me/stacktrace.js:47:24)
    at top (/Users/me/stacktrace.js:43:3)
    at Object.<anonymous> (/Users/me/stacktrace.js:53:1)
Run Code Online (Sandbox Code Playgroud)

我知道像superstack这样的模块,但是它们会出现补丁错误,并且似乎不适用于最新版本的节点.

Core本身只支持异步堆栈跟踪,但这是一个不推荐用于生产的实验/ dev开发功能.

有没有更好的方法来实现我想要的?

Nic*_*lin 2

现在,这可通过命令行标志用于节点 12.x 中的async函数(使用async关键字的函数,并非所有异步函数)--async-stack-traces。希望这最终能在各地标准化。

更多详细信息请参见发行说明功能文档

async目前不支持非功能,唉。