エラーシリアライゼーションのオーバーライド

カスタムエラーフォーマッターを実装し、特定のエラータイプをカスタマイズされたレスポンスで処理することで、Goaがエラーをシリアライズする方法をカスタマイズします。

Goaでは、エラーはフレームワークによって自動的に処理され、バリデーション エラー、内部サーバーエラー、カスタムビジネスロジックエラーなどの問題を 一貫した方法で伝達します。ただし、これらのエラーがクライアントに シリアライズまたは提示される方法をカスタマイズしたい場合があります。 このセクションでは、組み込みのバリデーションエラーを含む、あらゆる種類の エラーに対してGoaのデフォルトのエラーシリアライゼーションをオーバーライド する方法を説明します。

エラーシリアライゼーションのカスタマイズ

Goaは、カスタムエラーフォーマッター関数を実装することで、エラーの シリアライズ方法をカスタマイズする機能を提供します。このフォーマッターは エラーオブジェクトを受け取り、そのプロパティを検査してレスポンスで どのようにシリアライズされるべきかを決定できます。フォーマッターは 以下を含むあらゆる種類のエラーを処理できます:

  • Goaの組み込みバリデーションエラー
  • DSLで定義されたカスタムサービスエラー
  • 標準のGoエラー
  • サードパーティのエラータイプ

フォーマッターは、エラーペイロードの構造とHTTPステータスコードの両方を 決定するレスポンスオブジェクトを返します。これにより、エラーがAPI クライアントにどのように提示されるかを完全に制御できます。

例:特定のエラータイプのカスタムエラーシリアライゼーション

必須フィールドの欠落エラーやカスタムビジネスロジックエラーなど、特定の エラータイプのシリアライゼーションをカスタマイズしたい場合を考えてみましょう。 カスタムエラータイプと対応するエラーフォーマッターを定義することで、 これを実現できます。

ステップ1:カスタムエラータイプの定義

まず、特定のエラーのシリアライズに使用されるカスタムエラータイプを定義 します。これらのタイプは、適切なHTTPステータスコードを返すためにStatuser インターフェースを実装する必要があります。

// missingFieldErrorは、必須フィールドの欠落エラーをシリアライズするために使用されるタイプです。
type missingFieldError string

// StatusCodeは400(BadRequest)を返します。
func (missingFieldError) StatusCode() int {
    return http.StatusBadRequest
}

// customBusinessErrorは、カスタムビジネスロジックエラーをシリアライズするために使用されるタイプです。
type customBusinessError string

// StatusCodeは422(Unprocessable Entity)を返します。
func (customBusinessError) StatusCode() int {
    return http.StatusUnprocessableEntity
}

ステップ2:カスタムエラーフォーマッターの実装

次に、エラーを検査し、エラーのプロパティに基づいて適切なカスタムエラー タイプに変換するカスタムエラーフォーマッターを実装します。

// customErrorResponseは、エラーのプロパティに基づいてerrをカスタムエラータイプに変換します。
func customErrorResponse(ctx context.Context, err error) Statuser {
    if serr, ok := err.(*goa.ServiceError); ok {
        switch serr.Name {
        case "missing_field":
            return missingFieldError(serr.Message)
        case "business_error":
            return customBusinessError(serr.Message)
        default:
            // 他のエラーにはGoaのデフォルトを使用
            return goahttp.NewErrorResponse(err)
        }
    }
    // その他のすべてのエラータイプにはGoaのデフォルトを使用
    return goahttp.NewErrorResponse(err)
}

ステップ3:カスタムエラーフォーマッターの使用

最後に、HTTPサーバーまたはハンドラーをインスタンス化する際にカスタム エラーフォーマッターを使用します。これにより、カスタムエラー シリアライゼーションロジックがサービスから返されるすべてのエラーに 適用されることが保証されます。

var (
    appServer *appsvr.Server
)
{
    eh := errorHandler(logger)
    appServer = appsvr.New(appEndpoints, mux, dec, enc, eh, customErrorResponse)
    // ...
}

カスタムエラーシリアライゼーションの利点

  • 一貫性: カスタムエラーシリアライゼーションにより、バリデーションエラーを含むAPI全体でエラーの提示方法の一貫性を維持できます。
  • 明確性: クライアントが特定のユースケースの問題を理解して解決するのに役立つ、より説明的なエラーメッセージや追加のコンテキストを提供できます。
  • 柔軟性: 既存のクライアント側のエラー処理ロジックとの統合やカスタムビジネスルールのサポートなど、特定の要件に合わせてエラーレスポンスを調整できます。

まとめ

Goaのカスタムエラーシリアライゼーションは、API全体での一貫性を維持しながら、 特定のニーズに合わせてエラーレスポンスを調整する強力な方法を提供します。 カスタムエラーフォーマッターを実装し、Goaのエラー処理メカニズムと統合 することで、クライアントにとってより意味のある実用的なエラーレスポンスを 作成できます。

エラーシリアライゼーションのカスタマイズ方法を理解したところで、次の セクションベストプラクティスに進み、Goaサービスで 堅牢なエラー処理を実装するための推奨パターンと戦略について学びましょう。