首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >节点中的异步堆栈跟踪

节点中的异步堆栈跟踪
EN

Stack Overflow用户
提问于 2017-09-13 04:45:39
回答 1查看 532关注 0票数 6

让我有点惊讶的是,我没有更多地被这个问题所困扰,但在另一个节拍中执行的回调中创建的节点错误没有合理的堆栈跟踪。

例如。

代码语言:javascript
复制
function base (cb)  {
  process.nextTick(() => {
    throw new Error("I am unhelpful")
  }, 1000)
}

function top (cb) {
  base(cb)
}

top(() => {})

结果如下:

代码语言:javascript
复制
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中时,这尤其糟糕,因为没有简单的路径返回跟踪来查找违规代码。想象一个涉及控制器、一些助手模块和第三方库的服务调用。

到目前为止,我的解决方案是为当前节拍中的潜在失败情况创建一个错误,然后在出现错误时传递它:

代码语言:javascript
复制
function base (cb)  {
  let potentialError = new Error('oh noes')
  process.nextTick((err) => {
    potentialError.message = err.message
    throw potentialError
  }, 1000)
}

这给了我一个堆栈跟踪,它实际上包括调用链:

代码语言:javascript
复制
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的支持,但这只是一个试验性的/开发的特性,不推荐用于生产。

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

EN

回答 1

Stack Overflow用户

发布于 2019-07-19 05:58:49

这现在可用于节点12.x中的async函数(使用async关键字的函数,而不是所有异步函数),方法是使用--async-stack-traces命令行标志。希望这最终将在所有地方得到标准化。

有关更多详细信息,请参阅release notesfeature document

遗憾的是,目前不支持非async函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46185064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档