Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the full Node.js stack trace when using async/await?

Let's say I have 12 async/await functions, and on the 12th one deep, an error happens. Right now, I have this code to catch all errors:

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

The problem is, the stacktrace is not returned:

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

On other projects, when I used callbacks with the structure of:

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

Then I had a nice stack trace of where the error has occured and the steps that led there. Now with async/await I've tried catching errors at all kinds of levels with no result. I've also tried longjohn and stackup -- and I still get only the last function that threw the error.

Help -- how do I see the complete stack?! And what's the proper way to catch nested async/await errors?

EDIT: (a complete example)

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));
like image 485
John Derring Avatar asked Apr 10 '17 16:04

John Derring


3 Answers

This issue appears to be resolved in Node 12. With v12.6.0, the snippet in the original post yields the following stack trace:

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)
like image 140
ralfstx Avatar answered Nov 20 '22 00:11

ralfstx


It is not possible to get the stack trace after the first await statement, in an async function, as of today.

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

like image 44
K. Norbert Avatar answered Nov 20 '22 02:11

K. Norbert


unhandledRejection error handler might not be the right way to try to catch all these. I'd suggest wrapping your async/awaits in try/catch blocks:

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

This should give you a better stack trace.

like image 1
Josh Beam Avatar answered Nov 20 '22 00:11

Josh Beam