コンパイラかく語りき

import { Fun } from 'programming'

【JavaScript】Error 内容を JSON.stringify する(原因不明の空オブジェクト文字列の正体?)

概要

Error オブジェクト(のインスタンス)を JSON.stringify すると、空オブジェクトの文字列になる。 

JSON.stringify(new Error('this is erorr')) // '{}'

ログ監視・エラー監視などでありがち。

原因

空オブジェクトの文字列になってしまう理由としては、 JSON.stringify はオブジェクトの enumerable なプロパティのみシリアライズする。

そして Error オブジェクトは enumertable なプロパティを持たない。

参考: プロパティの列挙可能性と所有権 - JavaScript | MDN

対応

以下のようにすると、 Error の内容やスタックトレースが stringify できる。

const err = new Error('this is erorr')
JSON.stringify(err, Object.getOwnPropertyNames(err))
//  '{"stack":"Error: this is erorr\\n    at repl:1:13\\n    at Script.runInThisContext (vm.js:120:20)\\n    at REPLServer.defaultEval (repl.js:433:29)\\n    at bound (domain.js:426:14)\\n    at REPLServer.runBound [as eval] (domain.js:439:12)\\n    at REPLServer.onLine (repl.js:760:10)\\n    at REPLServer.emit (events.js:327:22)\\n    at REPLServer.EventEmitter.emit (domain.js:482:12)\\n    at REPLServer.Interface._onLine (readline.js:329:10)\\n    at REPLServer.Interface._line (readline.js:658:8)","message":"this is erorr"}'

参考: javascript - Is it not possible to stringify an Error using JSON.stringify? - Stack Overflow