节点中的异步堆栈跟踪

时间:2017-09-12 20:45:39

标签: node.js asynchronous error-handling

我有点惊讶我没有受到这种情况的困扰,但是在另一个tick中执行的回调中创建的节点错误没有一个合理的堆栈跟踪。

E.g。

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

function top (cb) {
  base(cb)
}

top(() => {})

结果:

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

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

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

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

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

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)

我知道像superstack这样的模块,但它们会出现补丁程序错误,似乎无法使用最新版本的节点。

Core本身只支持async stack traces,但这是一个不推荐用于制作的实验/开发功能。

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

1 个答案:

答案 0 :(得分:0)

现在可以通过--async-stack-traces命令行标志在节点12.x中使用它。希望这最终将在所有地方得到标准化。

release notesfeature document中的更多详细信息。