1. ホーム
  2. graphql

GraphQLではログインはQueryであるべきではないのでしょうか?

2023-10-25 09:21:03

質問

チュートリアル では、GraphQL 認証に関する login ミューテーション :

type Mutation {
  post(url: String!, description: String!): Link!
  signup(email: String!, password: String!, name: String!): AuthPayload
  login(email: String!, password: String!): AuthPayload
}

ログインは クエリ からです。

  1. この操作はサーバーに副作用を与えません。
  2. 目標は クエリ トークンを取得することです。

何か見逃していませんか?

どのように解決するのですか?

その例の文脈では login はMutationではなくQueryであるべきで、そのリゾルバには副作用がないと仮定している、少なくとも仕様によれば。しかし、おそらくそれが実際に行われることはないだろうという理由がいくつかあります。

  • 認証を実装している場合、ログイン/ログアウト イベントに関するデータを保持するか、少なくともアカウントのレコードにある種の "最終ログイン" フィールドを含めることによって、ユーザーのアカウント活動を記録したいと思うことでしょう。そのデータを変更する 副次的な効果になります。

  • 副作用に関係なく、ユーザーのアクションから生じるすべての操作をミューテーションとして扱うという慣習が発展してきました。これは react-apollo で、例えば useQuery はマウント時に関連するクエリを実行し、一方 useMutation はそのクエリを実行するために呼び出すことのできる関数を提供するだけです。Apolloをクライアントサイドで使用することを計画しているのであれば、スキーマを設計する際に、そのようなクライアント機能を考慮することは価値があります。

  • 変異は順次実行されますが、クエリは同時に実行されます。つまり、同じ呼び出しの中で、ログイン変異とその後に続く1つ以上の他の変異を実行することは予測可能であり、その後の呼び出しで認証されたコンテキストを利用することができるようになります。同じことはクエリでは言えません。 login がクエリで、同じ操作で他のクエリを含む場合、それらはすべて同時に解決され始めます。

実行方法(順次か同時か)以外では、サーバー側では、クエリと変異は事実上交換可能です。副作用のあるクエリや副作用のない変異がある可能性があります。おそらく慣習にこだわるべきですが、時には慣習を捨てなければならない正当な理由もあると思います。