Create a gist now

Instantly share code, notes, and snippets.

Properties of Error instances in the latest V8 included by node@0.6.6 are not enumerable. And thus cannot be serialized through JSON.stringify
> var err = new Error('wtf?');
> JSON.stringify(err)
'{"stack":"Error: wtf?\\n at [object Context]:1:11\\n at Interface.<anonymous> (repl.js:179:22)\\n at Interface.emit (events.js:64:17)\\n at Interface._onLine (readline.js:153:10)\\n at Interface._line (readline.js:408:8)\\n at Interface._ttyWrite (readline.js:585:14)\\n at ReadStream.<anonymous> (readline.js:73:12)\\n at ReadStream.emit (events.js:81:20)\\n at ReadStream._emitKey (tty_posix.js:307:10)\\n at ReadStream.onData (tty_posix.js:70:12)","message":"wtf?"}'
> Object.keys(err);
[ 'stack', 'arguments', 'type', 'message' ]
> Object.getOwnPropertyDescriptor(err, 'stack');
{ get: [Function], set: [Function], enumerable: true, configurable: true }
> process.versions.v8
$ node
> var err = new Error('wtf?');
> JSON.stringify(err);
> Object.keys(err);
[ ]
> Object.getOwnPropertyDescriptor(err, 'stack');
{ get: [Function], set: [Function], enumerable: false, configurable: true }
> console.dir('wtffff fuuuuuuu');
'wtffff fuuuuuuu'
> process.versions.v8
jfhbrook commented Jan 3, 2012

I can at least confirm that it works in v0.4.12 and not in v0.6.6. That's insane and annoying.


Same behavior when installing versions of Chrome using the target V8 versions.


I had the problem in v0.6.6. Was wondering why do we have a ghost error object!

Raynos commented Jan 3, 2012

Dirty hack fix would be something like having Error.prototype.toJSON return an object with the enumerable properties

Error.prototype.toJSON = function () {
  var json =  {};
  Object.getOwnPropertyNames(this).forEach(addToJSON, this);
  return json;

  function addToJSON(name) {
    var pd = Object.getOwnPropertyDescriptor(this, name);
    pd.enumerable = true;
    Object.defineProperty(json, name, pd);

I can confirm this is still an issue in v8 and node 0.10.15

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment