GraphQLではログインはQueryであるべきではないのでしょうか?
質問
で
チュートリアル
では、GraphQL 認証に関する
login
は
ミューテーション
:
type Mutation {
post(url: String!, description: String!): Link!
signup(email: String!, password: String!, name: String!): AuthPayload
login(email: String!, password: String!): AuthPayload
}
ログインは クエリ からです。
- この操作はサーバーに副作用を与えません。
- 目標は クエリ トークンを取得することです。
何か見逃していませんか?
どのように解決するのですか?
その例の文脈では
login
はMutationではなくQueryであるべきで、そのリゾルバには副作用がないと仮定している、少なくとも仕様によれば。しかし、おそらくそれが実際に行われることはないだろうという理由がいくつかあります。
-
認証を実装している場合、ログイン/ログアウト イベントに関するデータを保持するか、少なくともアカウントのレコードにある種の "最終ログイン" フィールドを含めることによって、ユーザーのアカウント活動を記録したいと思うことでしょう。そのデータを変更する は 副次的な効果になります。
-
副作用に関係なく、ユーザーのアクションから生じるすべての操作をミューテーションとして扱うという慣習が発展してきました。これは
react-apollo
で、例えばuseQuery
はマウント時に関連するクエリを実行し、一方useMutation
はそのクエリを実行するために呼び出すことのできる関数を提供するだけです。Apolloをクライアントサイドで使用することを計画しているのであれば、スキーマを設計する際に、そのようなクライアント機能を考慮することは価値があります。 -
変異は順次実行されますが、クエリは同時に実行されます。つまり、同じ呼び出しの中で、ログイン変異とその後に続く1つ以上の他の変異を実行することは予測可能であり、その後の呼び出しで認証されたコンテキストを利用することができるようになります。同じことはクエリでは言えません。
login
がクエリで、同じ操作で他のクエリを含む場合、それらはすべて同時に解決され始めます。
実行方法(順次か同時か)以外では、サーバー側では、クエリと変異は事実上交換可能です。副作用のあるクエリや副作用のない変異がある可能性があります。おそらく慣習にこだわるべきですが、時には慣習を捨てなければならない正当な理由もあると思います。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン