GraphQLのルートクエリフィールドviewer
の目的は何ですか?
この記事 に基づいて、viewer
を使用してトークンパラメータを受け入れることができるため、現在ログインしているユーザーを確認できます。
どのように実装すればよいですか?
viewer
ルートクエリフィールドの目的viewer
は、GraphQLやリレー固有のものではありません。ほとんどのWebアプリケーションは、ユーザーまたはビューアのいくつかの目的を果たします。ユーザーに提供されるさまざまなデータをモデル化する最上位エンティティは、viewer
と名付けることができます。 user
という名前を付けることもできます。たとえば、 Relay todo example にはviewer
ルートクエリフィールドがあります。
viewer: {
type: GraphQLUser,
resolve: () => getViewer(),
},
viewer
がなくてもかまいません。たとえば、 Relay starwars example にはviewer
ルートクエリフィールドがありません。
つまり、このviewer
をGraphQLスキーマのルートクエリフィールドとして持つことで、現在のユーザーに基づいてデータを提供できます。
私の答えは、あなたの言及された記事ですでに説明されていることに従います。手順は次のとおりです。
サーバー側で、ミューテーションを作成して認証トークンを取得します。 LoginMutation
という名前を付けましょう。この変更への入力はユーザー資格情報であり、出力は認証トークンです。
クライアント側で relay framework を使用する場合は、クライアント側の変更を実装します。変更が成功したら、認証トークンを保存します。
クライアント側のリレーコードで、authToken
クエリのviewer
パラメータを追加します。 authToken
の値は、ログイン変更が成功した後に受信した認証トークンです。
記事ですでに述べたように、ユーザーを認証する別の方法は、GraphQLの外部で行うことです。詳細については、2つの優れた回答 this と this を参照してください。
Jonas Helferがこれについて2部構成の記事を書いています。これは非常に便利です。 Part 1 、 Part 2
viewer
フィールド(設計パターン)の背後にあるアイデアは、現在ログインしているユーザーにのみ関連するトップレベルのクエリフィールドをグループ化することでした。例えば:
# EXAMPLE 1
quer {
viewer {
stories { ... } # the list of published stores as well as drafts (current user)
}
stories { ... } # the list of published stories (all users)
}
現在ログに記録されているこのユーザーデータは、viewer
フィールド自体にマージされたか、その下にネストされていました:
# EXAMPLE 2
query {
viewer {
id
email
displayName
stories { ... }
}
}
# EXAMPLE 3
query {
viewer {
me { id email displayName }
stories { ... }
}
}
上記の3つの例はすべて、viewer
フィールドを完全に削除することで簡略化できますが、まったく同じ機能を備えています(推奨)。
query {
# The currently logged in user or NULL if not logged in
me {
id
email
displayName
}
# Published stories only (all users)
stories {
...
}
# Published stories as well as drafts (the current user)
stories(drafts: true) {
...
}
}
完全な例は React Starter Kit にあります。これは、参照プロジェクトとして、または新しい開発のシード/テンプレートとして使用できます。見る - src/server/schema.js
。