1. HOME
  2. ブログ
  3. IT技術
  4. Ruby on Rails&GraphQLのエラーレスポンス

Ruby on Rails&GraphQLのエラーレスポンス

はじめに

前回の記事の続きになります!

GraphQLにおけるエラーレスポンス

一般的なHTTP通信のエラーレスポンスでは、ステータスコードで判断しますが、基本的にGraphQLからは200か500しか返せません。

なので200のレスポンスの中でerrorsフィールドを返すというのがベストプラクティスとされているようです。

【参考】
https://spec.graphql.org/October2021/#sec-Errors

Ruby on Rails & GraphQLにおけるエラーレスポンスの実装

ではRails上ではどうするのかというと、GraphQL::ExecutionErrorという例外を発生させることでベストプラクティスな実装をすることができます。

【参考】
https://graphql-ruby.org/errors/error_handling.html

前回の記事で実装したUser APIにエラーレスポンスを組み込んでみましょう!

特定User取得のエラーレスポンスの現状

まず最初に現状を確認します。

rails s コマンドでサーバーを起動し、graphiqlにアクセスし、登録されていないidでリクエストしてみましょう。

errorsはレスポンスされましたが、backtraceがそのまま出ちゃっていますね。

Postmanで確認してみると、500エラーになっていることがわかります。

GraphqlControllerの中に protect_from_forgery を入れないと、422エラーになるので注意

これはUser Modelで発生したActiveRecord::RecordNotFoundエラーがそのまま伝播し、500エラーになっています。

なのでrescueコードを用いて、代わりにGraphQL::ExecutionErrorを伝播させましょう!

特定User取得のエラーレスポンスの実装

リクエストパラメータにあるidがUsersテーブル上に存在しない場合のエラーレスポンスを実装します。

User.findメソッドをbegin-rescueで囲って、GraphQL::ExecutionErrorをraiseしているだけですね。

早速実行結果を見ていきましょう!

コード上で指定したメッセージで表示されていて、backtraceも消えていますね。

Postmanで見ると、ステータスコードが200になっていることがわかります。

ただし、現状メッセージだけでしかエラーが判別できません。

ベストプラクティスにもあるように、errors内にextensions:codeで、ステータスコードのように大まかなエラー内容が区別できるようにしましょう!

エラーレスポンスにエラーコードを追加

まずはエラーコードを管理するファイルを作成します。

今回はUserが見つからないエラーなので、NOT_FOUNDのコードを実装します。

私のプロジェクトではこれをlibフォルダに追加したので、config/application.rbに以下の変更を入れました。

さきほど実装したGraphQL::ExecutionErrorに代入しましょう。

こちらは単純に、GraphQL::ExecutionErrorの初期化時にextensions引数を用いてるだけですね。

これでエラーコードをレスポンスに代入することができました!

まとめ

HTTPステータスコードが指定できないので、若干ややこしい仕様になっていますが、エラーレスポンスを実装することができました。

GraphQLを学び始めたときに実装を悩んだ箇所だったので、参考になりましたらうれしいです!

今回のコードも以下のリポジトリにまとめてありますので、ぜひ確認してみてください。

https://github.com/ryuto-imai/test_graphql_api

※前回の記事時点のコードは以下のタグに残してあります

https://github.com/ryuto-imai/test_graphql_api/tree/ruby-on-rails-graphql-environment-implementation-syain

関連記事

採用情報

\ あの有名サービスに参画!? /

バックエンドエンジニア

\ クリエイティブの最前線 /

フロントエンドエンジニア

\ 世界を変える…! /

Androidエンジニア

\ みんなが使うアプリを創る /

iOSエンジニア