Goaでは、エラーはフレームワークによって自動的に処理され、バリデーション エラー、内部サーバーエラー、カスタムビジネスロジックエラーなどの問題を 一貫した方法で伝達します。ただし、これらのエラーがクライアントに シリアライズまたは提示される方法をカスタマイズしたい場合があります。 このセクションでは、組み込みのバリデーションエラーを含む、あらゆる種類の エラーに対してGoaのデフォルトのエラーシリアライゼーションをオーバーライド する方法を説明します。
Goaは、カスタムエラーフォーマッター関数を実装することで、エラーの シリアライズ方法をカスタマイズする機能を提供します。このフォーマッターは エラーオブジェクトを受け取り、そのプロパティを検査してレスポンスで どのようにシリアライズされるべきかを決定できます。フォーマッターは 以下を含むあらゆる種類のエラーを処理できます:
フォーマッターは、エラーペイロードの構造とHTTPステータスコードの両方を 決定するレスポンスオブジェクトを返します。これにより、エラーがAPI クライアントにどのように提示されるかを完全に制御できます。
必須フィールドの欠落エラーやカスタムビジネスロジックエラーなど、特定の エラータイプのシリアライゼーションをカスタマイズしたい場合を考えてみましょう。 カスタムエラータイプと対応するエラーフォーマッターを定義することで、 これを実現できます。
まず、特定のエラーのシリアライズに使用されるカスタムエラータイプを定義
します。これらのタイプは、適切な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
}
次に、エラーを検査し、エラーのプロパティに基づいて適切なカスタムエラー タイプに変換するカスタムエラーフォーマッターを実装します。
// 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)
}
最後に、HTTPサーバーまたはハンドラーをインスタンス化する際にカスタム エラーフォーマッターを使用します。これにより、カスタムエラー シリアライゼーションロジックがサービスから返されるすべてのエラーに 適用されることが保証されます。
var (
appServer *appsvr.Server
)
{
eh := errorHandler(logger)
appServer = appsvr.New(appEndpoints, mux, dec, enc, eh, customErrorResponse)
// ...
}
Goaのカスタムエラーシリアライゼーションは、API全体での一貫性を維持しながら、 特定のニーズに合わせてエラーレスポンスを調整する強力な方法を提供します。 カスタムエラーフォーマッターを実装し、Goaのエラー処理メカニズムと統合 することで、クライアントにとってより意味のある実用的なエラーレスポンスを 作成できます。
エラーシリアライゼーションのカスタマイズ方法を理解したところで、次の セクションベストプラクティスに進み、Goaサービスで 堅牢なエラー処理を実装するための推奨パターンと戦略について学びましょう。