How to print a stack trace in Node.js?

Javascriptnode.jsStack Trace

Javascript Problem Overview


Does anyone know how to print a stack trace in Node.js?

Javascript Solutions


Solution 1 - Javascript

Any Error object has a stack member that traps the point at which it was constructed.

var stack = new Error().stack
console.log( stack )

or more simply:

console.trace("Here I am!")

Solution 2 - Javascript

Now there's a dedicated function on console for that:

console.trace()

Solution 3 - Javascript

As already answered, you can simply use the trace command:

console.trace("I am here");

However, if you came to this question searching about how to log the stack trace of an exception, you can simply log the Exception object.

try {  
  // if something unexpected
  throw new Error("Something unexpected has occurred.");     

} catch (e) {
  console.error(e);
}

It will log:

> Error: Something unexpected has occurred.
>     at main (c:\Users\Me\Documents\MyApp\app.js:9:15)
>     at Object. (c:\Users\Me\Documents\MyApp\app.js:17:1)
>     at Module._compile (module.js:460:26)
>     at Object.Module._extensions..js (module.js:478:10)
>     at Module.load (module.js:355:32)
>     at Function.Module._load (module.js:310:12)
>     at Function.Module.runMain (module.js:501:10)
>     at startup (node.js:129:16)
>     at node.js:814:3


If your Node.js version is < than 6.0.0, logging the Exception object will not be enough. In this case, it will print only:

> [Error: Something unexpected has occurred.]

For Node version < 6, use console.error(e.stack) instead of console.error(e) to print the error message plus the full stack, like the current Node version does.


Note: if the exception is created as a string like throw "myException", it's not possible to retrieve the stack trace and logging e.stack yields undefined.

To be safe, you can use

console.error(e.stack || e);

and it will work for old and new Node.js versions.

Solution 4 - Javascript

To print stacktrace of Error in console in more readable way:

console.log(ex, ex.stack.split("\n"));

Example result:

[Error] [ 'Error',  '    at repl:1:7',  '    at REPLServer.self.eval (repl.js:110:21)',  '    at Interface.<anonymous> (repl.js:239:12)',  '    at Interface.EventEmitter.emit (events.js:95:17)',  '    at Interface._onLine (readline.js:202:10)',  '    at Interface._line (readline.js:531:8)',  '    at Interface._ttyWrite (readline.js:760:14)',  '    at ReadStream.onkeypress (readline.js:99:10)',  '    at ReadStream.EventEmitter.emit (events.js:98:17)',  '    at emitKey (readline.js:1095:12)' ]

Solution 5 - Javascript

@isaacs answer is correct, but if you need more specific or cleaner error stack, you can use this function:

function getCleanerStack() {
   var err = new Error();
   Error.captureStackTrace(err, getStack);
    
   return err.stack;
}

This function is inspired directly from the console.trace function in NodeJS.

Source code: Recent version or Old version.

Solution 6 - Javascript

In v15.12.0, there are various methods for doing this,

1. console.trace(anything)
2. Error.captureStackTrace(Object)
3. console.log(new Error().stack)
4. Try Catch - Use console.log(e), where `e` is catched by catch block

OR even better use stacktracejs in any Javascript code

Solution 7 - Javascript

Try Error.captureStackTrace(targetObject[, constructorOpt]).

const myObj = {};
function c() {
  // pass
}

function b() {
    Error.captureStackTrace(myObj)
    c()
} 

function a() {
    b()
}

a()

console.log(myObj.stack)

The function a and b are captured in error stack and stored in myObj.

Solution 8 - Javascript

For what I know printing the complete stack trace in nodejs is not possible, you can just print a "partial" stack trace, you can not see from where you came from in the code, just where the Exception occur. That's what Ryan Dahl explains in this youtube video. http://youtu.be/jo_B4LTHi3I at min 56:30 for being precise. Hope this helps

Solution 9 - Javascript

In case someone is still looking for this like I was, then there is a module we can use called "stack-trace". It is really popular. NPM Link

Then walk through the trace.

  var stackTrace = require('stack-trace');
  .
  .
  .
  var trace = stackTrace.get();
  trace.map(function (item){ 
    console.log(new Date().toUTCString() + ' : ' +  item.toString() );  
  });

Or just simply print the trace:

var stackTrace = require('stack-trace');
.
.
.
var trace = stackTrace.get();
trace.toString();

Solution 10 - Javascript

If you want to only log the stack trace of the error (and not the error message) Node 6 and above automatically includes the error name and message inside the stack trace, which is a bit annoying if you want to do some custom error handling:

console.log(error.stack.replace(error.message, ''))

This workaround will log only the error name and stack trace (so you can, for example, format the error message and display it how you want somewhere else in your code).

The above example would print only the error name follow by the stack trace, for example:

Error: 
    at /Users/cfisher/Git/squashed/execProcess.js:6:17
    at ChildProcess.exithandler (child_process.js:213:5)
    at emitTwo (events.js:106:13)
    at ChildProcess.emit (events.js:191:7)
    at maybeClose (internal/child_process.js:877:16)
    at Socket.<anonymous> (internal/child_process.js:334:11)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
    at Pipe._handle.close [as _onclose] (net.js:498:12)

Instead of:

Error: Error: Command failed: sh ./commands/getBranchCommitCount.sh HEAD
git: 'rev-lists' is not a git command. See 'git --help'.

Did you mean this?
        rev-list

    at /Users/cfisher/Git/squashed/execProcess.js:6:17
    at ChildProcess.exithandler (child_process.js:213:5)
    at emitTwo (events.js:106:13)
    at ChildProcess.emit (events.js:191:7)
    at maybeClose (internal/child_process.js:877:16)
    at Socket.<anonymous> (internal/child_process.js:334:11)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
    at Pipe._handle.close [as _onclose] (net.js:498:12)

Solution 11 - Javascript

Get function caller details:

/**
 * @typedef {Object} TCallerInfo
 * @property {() => string} toString
 * @property {string} str Caller error stack line.
 * @property {string} file Caller file path.
 * @property {number} line Caller line.
 * @property {number} col Caller column.
 * @property {Error} error Caller error stack instance.
 */

/**
 * @returns {TCallerInfo | null}
 */
function getCallerLine() {
  const err = new Error();
  const stack = err.stack || '';
  const callerLine = stack.split(/\n\s*at\s+/g);

  if (callerLine.length >= 2) {
    const str = callerLine[3];
    const [file, line, col] = str
      .replace(/^\s*at\s+/, '')
      .replace(/^(.*):(\d+):(\d+)$/, '$1|$2|$3')
      .split(/\|/g);

    const o = {
      toString: () => str,

      get str() {
        return str;
      },

      get file() {
        return file;
      },

      get line() {
        return parseInt(line);
      },

      get col() {
        return parseInt(col);
      },

      get error() {
        return err;
      },
    };

    return o;
  } else {
    return null;
  }
}

Usage:

function foo() {
  console.info(getCallerLine());
}

foo(); // Prints this line as Caller Line details.

Solution 12 - Javascript

you can use node-stack-trace module which is a power full module to track call stacks.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionmike.toStringView Question on Stackoverflow
Solution 1 - JavascriptisaacsView Answer on Stackoverflow
Solution 2 - JavascriptMariusz NowakView Answer on Stackoverflow
Solution 3 - JavascriptZanonView Answer on Stackoverflow
Solution 4 - JavascriptruXView Answer on Stackoverflow
Solution 5 - JavascriptSquidward TentaclesView Answer on Stackoverflow
Solution 6 - Javascriptuser14888944View Answer on Stackoverflow
Solution 7 - JavascriptZheeengView Answer on Stackoverflow
Solution 8 - JavascriptElHackerView Answer on Stackoverflow
Solution 9 - JavascriptLaszloView Answer on Stackoverflow
Solution 10 - JavascriptGrayedFoxView Answer on Stackoverflow
Solution 11 - JavascriptEduardo CuomoView Answer on Stackoverflow
Solution 12 - JavascriptNitin9791View Answer on Stackoverflow