gpt4 book ai didi

node.js - Node 中的异步堆栈跟踪

转载 作者:搜寻专家 更新时间:2023-10-31 22:53:48 24 4
gpt4 key购买 nike

我有点惊讶我没有再被这个问题困扰,但是在另一个 tick 中执行的回调中创建的 Node 错误没有正常的堆栈跟踪。

例如

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

当异常发生在执行异步操作的库的回调/ promise 中时,这尤其糟糕,因为没有简单的路径备份跟踪以找到有问题的代码。想象一下涉及 Controller 、一些帮助程序模块和第三方库的服务调用。

到目前为止,我的解决方案是为当前 tick 中的潜在失败案例创建一个错误,如果有错误,则将其传递:

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 这样的模块但它们会出现补丁错误,并且似乎不适用于最新版本的 Node 。

核心本身只是内置了对 async stack traces 的支持但这是一个实验性/开发功能,不推荐用于生产。

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

最佳答案

这现在可用于 Node 12.x 中的 async 函数(使用 async 关键字的函数,并非所有异步函数)通过​​ --async-堆栈跟踪 命令行标志。希望这最终会在所有地方标准化。

release notes 中有更多详细信息和 feature document .

目前不支持非 async 函数,唉。

关于node.js - Node 中的异步堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46185064/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com