À quoi sert le champ de requête racine viewer
dans GraphQL?
Basé sur cet article , viewer
pourrait être utilisé pour accepter un paramètre de jeton afin que nous puissions voir qui est actuellement connecté.
Comment dois-je l'implémenter?
viewer
viewer
n'est pas quelque chose de spécifique à GraphQL ou Relay. La plupart des applications Web servent à certaines fins de ses utilisateurs ou téléspectateurs. L'entité de niveau supérieur pour modéliser les diverses données servies à l'utilisateur peut être nommée viewer
. Vous pouvez également le nommer user
. Par exemple, le exemple de tâche de relais a un champ de requête racine viewer
:
viewer: {
type: GraphQLUser,
resolve: () => getViewer(),
},
Nous pouvons également nous passer de viewer
. Par exemple, exemple Relay starwars n'a pas de champ de requête racine viewer
.
En bref, avoir ce viewer
comme champ de requête racine du schéma GraphQL nous permet de fournir des données basées sur l'utilisateur actuel.
Ma réponse suit ce qui est déjà décrit dans votre article mentionné. Les étapes sont les suivantes:
Côté serveur, créez une mutation pour obtenir un jeton d'authentification. Appelons-le LoginMutation
. L'entrée de cette mutation sont les informations d'identification de l'utilisateur et la sortie est un jeton d'authentification.
Côté client, si vous utilisez framework relais , implémentez une mutation côté client. Une fois la mutation réussie, stockez le jeton d'authentification.
Sur le code de relais côté client, ajoutez le paramètre authToken
pour vos requêtes viewer
. La valeur de authToken
est le jeton d'authentification reçu après une mutation de connexion réussie.
Comme déjà mentionné dans l'article, une autre façon d'authentifier l'utilisateur est de le faire en dehors de GraphQL. Vous voudrez peut-être voir deux excellentes réponses this et this pour plus de détails.
Jonas Helfer a écrit un article en deux parties à ce sujet, que vous trouverez très utile: Partie 1 , Partie 2
L'idée derrière le champ viewer
(modèle de conception) était de regrouper les champs de requête de niveau supérieur qui ne concernent que l'utilisateur actuellement connecté. Par exemple:
# EXAMPLE 1
quer {
viewer {
stories { ... } # the list of published stores as well as drafts (current user)
}
stories { ... } # the list of published stories (all users)
}
Ces données utilisateur actuellement enregistrées ont été fusionnées dans le champ viewer
lui-même ou imbriquées sous celui-ci:
# EXAMPLE 2
query {
viewer {
id
email
displayName
stories { ... }
}
}
# EXAMPLE 3
query {
viewer {
me { id email displayName }
stories { ... }
}
}
Les trois exemples ci-dessus peuvent être simplifiés en supprimant complètement le champ viewer
et ont toujours la même fonctionnalité (recommandée):
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) {
...
}
}
Vous pouvez trouver l'exemple complet dans React Starter Kit qui peut être utilisé soit comme projet de référence, soit comme graine/modèle pour de nouveaux développements. Voir src/server/schema.js
.