- js の error は列挙可能な prop がないので
JSON.stringify
すると{}
になる - message とか trace とかを serialize したいケースではこいつが使えそう
- あんまり star 数ない、多分 sentry とかに流すから自前実装するニーズ自体少ないのかな
この子 pure esm package なので lambda とか commonjs 環境で使えない ... 。
$ npm i serialize-error@8.1.0
// 公式にのってるまま
// serialize => deserialize しても error の props は列挙不可能のままなど
// 独自な改造は特にしないようにしているっぽい
import { serializeError, deserializeError } from 'serialize-error'
const error = new Error('🦄')
console.log(error)
//=> [Error: 🦄]
const serialized = serializeError(error)
console.log(serialized)
//=> {name: 'Error', message: '🦄', stack: 'Error: 🦄\n at Object.<anonymous> …'}
const deserialized = deserializeError(serialized)
console.log(deserialized)
//=> [Error: 🦄]
feat: Add Errors serialization to json-stringify-safe #1060
【JavaScript】Error 内容を JSON.stringify する(原因不明の空オブジェクト文字列の正体?)
- 多分ある程度の規模だと sentry とか datadog に飛ばす
- ので ↑ library の commonjs 対応の (というか library 自体の) ニーズ薄い
- sentry の repo 漁ってみたら同じような対応を自前でしてた
- JSON.parse の replacer で prop 調整してるだけ
- deserialize みたいなトリックしない & sentry 入れるほどの規模じゃないけど error 収集したいくらいのニーズなら、正直この PR 参考にして自前でいいかな ...
まぁまぁトリッキーなので、慎重に。
require できるように npm に上げた https://github.com/yano3nora/ts-utils/blob/main/src/error-2-json.ts
/**
* error to json string
*
* @ref https://github.com/getsentry/sentry-javascript/pull/1060/files
* @ref https://sosukesuzuki.dev/posts/stage-3-object-hasown/
*/
export const error2json = (error: any) => {
const e: any = {
name: error?.name,
message: error?.message,
stack: error?.stack,
}
// for custom props (not inherited)
for (const prop in error) {
if (Object.hasOwn(error, prop)) {
e[prop] = error[prop]
}
}
return JSON.stringify(e)
}