web-dev-qa-db-fra.com

La connexion ne doit-elle pas être une requête dans GraphQL?

Dans le tutoriel sur l'authentification GraphQL, le login est une mutation :

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

La connexion ne doit-elle pas être un Requête puisque:

  1. L'opération n'a aucun effet secondaire sur le serveur.
  2. Le but est de requête un jeton.

Est-ce que j'ai râté quelque chose ?

25
gaspard

Dans le contexte de cet exemple, login devrait être une requête au lieu d'une mutation car son résolveur n'a aucun effet secondaire, du moins selon la spécification. Cependant, il y a quelques raisons pour lesquelles vous ne verrez probablement pas cela se faire dans la nature:

  • Si vous implémentez l'authentification, vous souhaiterez probablement enregistrer l'activité de votre compte d'utilisateurs, soit en conservant certaines données sur les événements de connexion/déconnexion, soit au moins en incluant une sorte de champ "dernière connexion" dans l'enregistrement du compte. La modification de ces données serait serait un effet secondaire.

  • Une convention a évolué qui traite toutes les opérations résultant des actions des utilisateurs comme des mutations, quels que soient les effets secondaires. Vous voyez cela avec react-apollo, par exemple, lorsque les composants Query lancent la requête associée au montage, tandis que les composants Mutation exposent simplement une fonction qui peut être appelée pour déclencher cette requête. Si vous prévoyez d'utiliser le côté client Apollo, il est utile de prendre en compte ce type de fonctionnalités client lors de la conception de votre schéma.

  • Les mutations sont exécutées séquentiellement, tandis que les requêtes sont exécutées simultanément. Cela signifie qu'il serait prévisible de déclencher une mutation de connexion et une ou plusieurs autres mutations après dans le même appel, vous permettant d'utiliser un contexte authentifié pour les appels suivants. La même chose ne pouvait pas être dite pour les requêtes - si login est une requête et que vous incluez d'autres requêtes avec elle dans la même opération, elles commenceront toutes à être résolues en même temps.

En dehors de la façon dont ils sont exécutés (séquentiellement ou simultanément), côté serveur, les requêtes et les mutations sont effectivement interchangeables. Vous pouvez avoir des requêtes avec des effets secondaires et des mutations sans effets secondaires. Vous devriez probablement vous en tenir aux conventions, mais je pense que parfois il y a des raisons valables pour lesquelles vous devrez peut-être jeter ces conventions par la fenêtre.

57
Daniel Rearden