質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

GraphQL

GraphQL は、アプリケーション・プログラミング・インタフェース (API) 向けのクエリ言語およびサーバーサイドランタイムです。APIの速度、柔軟性、開発者にとっての使いやすさを向上させるために設計され、データを複数のデータソースから取得するリクエストを1つのAPI呼び出しで構成できます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

Q&A

解決済

1回答

548閲覧

【Rails】GraphQL APIのMutaionにてresolveメソッドが呼ばれない事象について

msk6252

総合スコア12

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

GraphQL

GraphQL は、アプリケーション・プログラミング・インタフェース (API) 向けのクエリ言語およびサーバーサイドランタイムです。APIの速度、柔軟性、開発者にとっての使いやすさを向上させるために設計され、データを複数のデータソースから取得するリクエストを1つのAPI呼び出しで構成できます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

0グッド

0クリップ

投稿2023/05/01 14:36

編集2023/05/02 14:34

実現したいこと

GraphQL(Rails)で開発中のサービスにて、Mutationのresolveメソッドが呼ばれない事象が起きています。
上記事象を解消して、Mutationの実行ができるようにしたいです。
どなたかご存知の方、同様の事象にハマっている方がいらっしゃたら教えていただきたいです。

やったことなども見ていただきたいのですが、私の予想ではGraphQL、もしくはRails側に問題があるのではないかと考えております。

前提

現在Nextjs + GraphQL(Rails)で開発中のサービスにて、Mutationのresolveメソッドが呼ばれない事象が起きています。

発生している問題・エラーメッセージ

サービスの1機能として、ファイルアップロード機能をMutationで実現しようとしています。
通常の値更新のMutationについては問題なくresolveメソッドが呼び出されるのに対し、
ファイルアップロードが含まれるMutationについてはMutationのクラスが呼び出されていますがresolveメソッドが呼び出されていないです。

該当のソースコード

ruby

1# 2# ファイルアップロード機能を含んだMutation 3# 4module Mutations 5 class UpdateUser < BaseMutation 6 argument :name, String, required: false 7 argument :image, Types::Scalars::File, required: false 8 9 field :user, Types::UserType, null: true 10 field :errors, String, null: true 11 12 puts "+++++++++++++++++++" 13 puts "+++++++++++++++++++" 14 puts "+++++++++++++++++++" 15 puts "hogehoge" 16 puts "+++++++++++++++++++" 17 puts "+++++++++++++++++++" 18 19 def resolve(attributes) 20 # current_user = context[:current_user] 21 current_user = User.find(1) 22 23 puts "--------------------" 24 puts "--------------------" 25 puts "--------------------" 26 puts "--------------------" 27 28 current_user.name = 'test' 29 current_user.save! 30 end 31 end 32end

zsh

1# 2# 上記ソースコードを実行したときのリクエスト 3# クラス内「hogehoge」は呼ばれています。 4# しかし、resolveメソッド内の「---------------」は出力されていない かつ 5# SQLのUPDATE文が発行されていないことから呼び出されていないと判断 6# 7 8Started POST "/graphql" for 192.168.96.1 at 2023-05-01 22:52:55 +0900 9Processing by GraphqlController#execute as */* 10 Parameters: {"operations"=>"{\"operationName\":\"UpdateUser\",\"variables\":{\"name\":\"テスト太郎\",\"image\":null},\"query\":\"mutation UpdateUser($name: String, $image: File) {\\n updateUser(input: {name: $name, image: $image}) {\\n user {\\n id\\n name\\n nickname\\n __typename\\n }\\n __typename\\n }\\n}\"}", "map"=>"{\"1\":[\"variables.image\"]}", "1"=>#<ActionDispatch::Http::UploadedFile:0x00007f08170e6778 @tempfile=#<Tempfile:/tmp/RackMultipart20230501-111-w6zs3a.jpg>, @original_filename="calendar.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"1\"; filename=\"calendar.jpg\"\r\nContent-Type: image/jpeg\r\n">, "operationName"=>"UpdateUser", "variables"=>{"name"=>"テスト太郎", "image"=>#<ActionDispatch::Http::UploadedFile:0x00007f08170e6778 @tempfile=#<Tempfile:/tmp/RackMultipart20230501-111-w6zs3a.jpg>, @original_filename="calendar.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"1\"; filename=\"calendar.jpg\"\r\nContent-Type: image/jpeg\r\n">}, "query"=>"mutation UpdateUser($name: String, $image: File) {\n updateUser(input: {name: $name, image: $image}) {\n user {\n id\n name\n nickname\n __typename\n }\n __typename\n }\n}"} 11 User Load (5.4ms) SELECT `users`.* FROM `users` WHERE `users`.`uid` = 'xxxxxxxxxxxxx' LIMIT 1 12 ↳ app/lib/jwt.rb:38:in `get_user_info' 13+++++++++++++++++++ 14+++++++++++++++++++ 15+++++++++++++++++++ 16hogehoge 17+++++++++++++++++++ 18+++++++++++++++++++ 19Completed 200 OK in 5478ms (Views: 0.3ms | ActiveRecord: 36.1ms | Allocations: 19767)

request

1# 2# 別プロジェクトで同様のクエリでファイルが送られることは確認済み 3# 4mutation UpdateUser($name: String, $files: [File!]) { 5 updateUser(input: {name: $name, files: $files}) { 6 errors 7 } 8}

response

1# 2# エラーなどなくnullが返る 3# 4{ 5 "data": { 6 "updateUser": null 7 } 8}

debug(graphql_controller.rb)

1# 2# GraqhQLのクエリが実行される段階で渡される引数についてデバッグした結果 3# 4 5########## 6# コード 7########## 8 9result = RailsAppSchema.execute(query, variables: variables, context: context, operation_name: operation_name) 10debugger 11render json: result.to_json 12 13################## 14# 各変数のデバッグ結果 15# 16# executeに渡されている変数(query, variables, context, operation_name)について調査 17# 18################## 19 20# 21# 実行クエリ 22# 23(rdbg) query 24"mutation UpdateUser($name: String, $image: File) {\n updateUser(input: {name: $name, image: $image}) {\n user {\n id\n name\n nickname\n __typename\n }\n __typename\n }\n}" 25 26# 27# 変数 28# 29(rdbg) variables 30{"name"=>"テスト太郎", 31 "image"=> #<ActionDispatch::Http::UploadedFile:0x00007f0814096a28 @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"1\"; filename=\"calendar.jpg\"\r\nContent-Type: image/jpeg\r\n", @original_filename="calendar.jpg", @tempfile=#<File:/tmp/RackMultipart20230501-111-cvuxz9.jpg>>} 32 33# 34# Context 35# 36(rdbg) context 37{:current_user=> nil, 38 :request=>#<ActionDispatch::Request POST "https://xxxxxxxxx/graphql" for 192.168.96.1>, 39 :user_agent=>"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 40 :remote_ip=>"192.168.96.1"} 41 42# 43# operation_name 44# 45(ruby) operation_name 46"UpdateUser"

試したこと

  1. gem apollo_upload_server を利用する前はこちらを参考に自前でファイルアップロード機能を実装し、本事象が発生。
  2. gem graphql のバージョンを別プロジェクトで正常に動いているバージョン(2.0.14)に変更し試すも改善せず。
    1. で解消しなかったため、gem 'apollo_upload_server' を導入するも改善せず。
  3. Nextjsからではなく、クライアントツール(Firecamp)からクエリ実行するも同事象が発生。

補足情報(FW/ツールのバージョンなど)

  • Rails 7.0.4.2
  • GraphQL 2.0.14
  • apollo_upload_server(2.1)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

上記の質問、解決しました。
内容としてはとても初歩的な部分でした。。。

■ 原因
GraphQL側に認証機能を追加してましたが、一部の機能が正しく動作しなかったため、
resolveメソッドの実行が拒否されてました。

認証を通さない場合は、authorized?メソッドの返り値を常にtrueにするのを忘れていました。

■ 誤ったコード

module Mutations class BaseMutation < GraphQL::Schema::RelayClassicMutation argument_class Types::BaseArgument field_class Types::BaseField input_object_class Types::BaseInputObject object_class Types::BaseObject # # 認証の判定を行うauthorizedメソッドでなにも返していない # def authorized?(**args) end end end

■ 正しいコード

module Mutations class BaseMutation < GraphQL::Schema::RelayClassicMutation argument_class Types::BaseArgument field_class Types::BaseField input_object_class Types::BaseInputObject object_class Types::BaseObject # # 認証を通さない場合は、常にtrueを返す # def authorized?(**args) true end end end

投稿2023/05/02 17:33

編集2023/05/02 17:35
msk6252

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問