Stripe SDK(nodejs)でThrowされるErrorを自力でthrowする

なにいってるかわかんないかもですが、伝わる人には伝わるかなと。

やりたいこと

  • Stripe SDK経由でなにかしらのデータを取得したい
  • が、「特定の条件に合致しないもの」は、「取得しなかった扱い」にしたい
  • 後続処理では「StripeのAPIがデータを取得できなかった」ということにしたい
  • ので、Stripe SDKがなげるエラーを自分でなげたい

普通に使うと飛んでくるエラー

Stripe SDKは独自のエラーオブジェクトを投げてきます。

{
   type: 'StripeInvalidRequestError',
   raw: {
     code: 'resource_missing',
     doc_url: 'https://stripe.com/docs/error-codes/resource-missing',
     message: "No such customer: 'cus_XXXXXXX",
     param: 'id',
     type: 'invalid_request_error',
     headers: {
       server: 'nginx',
       date: 'Wed, 24 Mar 2021 10:33:45 GMT',
     },
     statusCode: 404,
     requestId: 'req_AAAAAAA'
   },
   rawType: 'invalid_request_error',
   code: 'resource_missing',
   doc_url: 'https://stripe.com/docs/error-codes/resource-missing',
   param: 'id',
....

TypeScriptの型定義では、Stripe.InvalidRequestErrorとかで参照できます。

Stripe.errorsでエラーオブジェクトを生成する

Stripe独自のエラーオブジェクトには、Stripe.errorsからアクセスできます。そのため、以下のようなコードを書くことでエラーを自分で投げることができます。

try {
  throw Stripe.errors.StripeInvalidRequestError.generate({
    code: 'resource_missing',
    message: "No such customer: 'cus_XXXXXXX",
    param: 'id',
    type: 'invalid_request_error',
    statusCode: 404,
  })
} catch (e) {
   console.log(e)
}

この場合、headersやrequestIdなどリクエストに関する情報がことごとくundefinedになることに注意しましょう。

type: 'StripeInvalidRequestError',
   raw: {
     code: 'resource_missing',
     message: "No such customer: 'cus_JXXXXX'",
     param: 'id',
     type: 'invalid_request_error',
     statusCode: 404
   },
   rawType: 'invalid_request_error',
   code: 'resource_missing',
   doc_url: undefined,
   param: 'id',
   detail: undefined,
   headers: undefined,
   requestId: undefined,
   statusCode: 404,
   charge: undefined,
   decline_code: undefined,
   payment_intent: undefined,
   payment_method: undefined,
   payment_method_type: undefined,
   setup_intent: undefined,
   source: undefined

coderawType、またはstatusCodeなどを使う場合に限って使える手法ですので、使い所には要注意です。

Comment