使用async / await时如何获取完整的Node.js堆栈跟踪?

时间:2017-04-10 16:40:58

标签: javascript node.js

假设我有12个async/await函数,并且在12日深处,会发生错误。现在,我有这个代码来捕获所有错误:

process.on('unhandledRejection', function {
    console.error(err);
    process.exit(1);
});

问题是,不会返回堆栈跟踪:

ReferenceError: sdfg is not defined
- get.js:29 Fruit.module.exports [as get]
  /project/models/fruit/get.js:29:2
- next_tick.js:129 process._tickDomainCallback
  internal/process/next_tick.js:129:7

在其他项目中,当我使用结构为:

的回调时
function doSomething(err, done) {
  if (err) { return done(err); }
  /* do something */
  return done(null, true);
}

然后我有一个很好的堆栈跟踪错误发生的位置和导致那里的步骤。现在使用async/await我尝试在各种级别捕获错误而没有结果。我还尝试了longjohnstackup - 我仍然只获得了抛出错误的最后一个函数。

帮助 - 如何查看完整的堆栈?!什么是捕获嵌套异步/等待错误的正确方法?

编辑:(完整示例)

const getA = async () => {
    await getB();
}

const getB = async () => {
    await getC();
    sdgf();
}

const getC = async () => {}

const start = async () => {
    await getA();
}

start().then().catch(e => console.error(e));

3 个答案:

答案 0 :(得分:1)

unhandledRejection错误处理程序可能不是尝试捕获所有这些的正确方法。我建议在try / catch块中包装你的async / awaits:

async function doSomething() {
  try {
    await doSomethingElse()
  } catch(err) {
    console.log(err)
  }
}

这可以为您提供更好的堆栈跟踪。

答案 1 :(得分:0)

从今天开始,在异步函数中的第一个await语句之后,无法获得堆栈跟踪。

https://github.com/nodejs/node/issues/11865

答案 2 :(得分:0)

此问题似乎已在节点12中得到解决。使用v12.6.0,原始帖子中的代码段将产生以下堆栈跟踪:

ReferenceError: sdgf is not defined
    at getB (/path/to/test.js:7:3)
    at async getA (/path/to/test.js:2:3)
    at async start (/path/to/test.js:15:3)