Skip to content

Instantly share code, notes, and snippets.

@yano3nora
Last active May 10, 2023 13:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yano3nora/ce7dd491840e01707fde373065e5db86 to your computer and use it in GitHub Desktop.
Save yano3nora/ce7dd491840e01707fde373065e5db86 to your computer and use it in GitHub Desktop.
serialize-error - Serializing JS Error Object. #js

Overview

sindresorhus/serialize-error

  • 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: 🦄]

Alternative function

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)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment