error.stack
includes the error message in some JS environments
Published on in JavaScript
Last updated on
In V8-based JS environments (e.g. Chrome, Deno and Node.js) and in Bun,
error.stack
= error class name + error.message
+ stack frames.
Table of contents
Context
I was logging an Error object's message
and stack
properties to Azure App Insights
(because error.cause
needs to be logged manually to App Insights),
and was baffled because error.stack
seemed to contain not only the stack trace,
but also the error message.
I thought App Insights was doing something wonky to the Error object.
Culprit: V8
Eventually I realized that that's how the V8 JS engine works. From V8's Stack trace API docs:
Here's an example of a fully formatted stack trace:
ReferenceError: FAIL is not defined at Constraint.execute (deltablue.js:525:2) at Constraint.recalculate (deltablue.js:424:21) at Planner.addPropagate (deltablue.js:701:6) at Constraint.satisfy (deltablue.js:184:15) at Planner.incrementalAdd (deltablue.js:591:21) at Constraint.addConstraint (deltablue.js:162:10) at Constraint.BinaryConstraint (deltablue.js:346:7) at Constraint.EqualityConstraint (deltablue.js:515:38) at chainTest (deltablue.js:807:6) at deltaBlue (deltablue.js:879:2)
Node.js's error.stack
docs
say it more explicitly:
The first line is formatted as
<error class name>: <error message>
, and is followed by a series of stack frames (each line beginning with "at ").
(It's mentioned in Node.js v4 docs as well. Node.js v4 was released in 2015.)
Non-V8 environments
In Firefox and Safari,
error.stack
contains only the stack trace.
Firefox's JS engine is SpiderMonkey;
Safari's JS engine is JavaScriptCore.
Bun is interesting
because it's also "powered by JavaScriptCore",
but its error.stack
includes the error class name and error message as well.
Non-standard
The Error.prototype.stack
page on MDN
says that it's a non-standard property:
Non-standard: This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.
Using error.stack
on the server is likely a-okay though
(as long as you are familiar with how it works in your JS environment).