3 votes

Comment traiter les nulls dans le schéma GraphQL

Je continue à recevoir l'erreur "Cannot return null for non-nullable field Airline.id." lorsque FlightSchedule.operatingAirline est null (parfaitement valide selon le schéma) et que le client interroge FlightSchedule.operatingAirline.id. Comment résoudre ce problème? Rendre Airline.id, Airline.code et Airline.name nullable résout le problème, mais ce n'est pas la bonne façon de résoudre ce problème car si une compagnie aérienne existe, ces 3 champs existeront toujours aussi. Voici mon schéma :

type Airline {
    id: String!,
    code: String!,
    name: String!
}

type FlightSchedule {
    airline: Airline!
    operatingAirline: Airline
}

Et voici ma requête :

  getFlightSchedules {
    airline
    {
      id
      code
      name
    }
    operatingAirline
    {
      id
      code
      name
    }
  }

6voto

Daniel Rearden Points 8834

Un champ se résoudra à null lorsqu'une erreur est rencontrée lors de sa résolution. Cela inclut les erreurs de validation comme celle que vous rencontrez. Selon la spécification :

Si lors de l'exécution de ExecuteSelectionSet() un champ avec un fieldType non nul lance une erreur de champ, alors cette erreur doit se propager à cet ensemble de sélection entier, se résolvant à null si cela est autorisé ou se propageant plus loin à un champ parent.

Si cela se produit, tout champ frère qui n'a pas encore été exécuté ou n'a pas encore renvoyé de valeur peut être annulé pour éviter un travail inutile.

En d'autres termes, si un champ parent est d'un certain type d'objet, et que ce type a un champ non nullable, et que ce champ se résout à null, ce champ parent se résoudra également à null. Le champ parent ne peut pas renvoyer un objet invalide (dans ce cas parce qu'il avait un champ non nullable renvoyé à null), donc la seule chose qu'il puisse faire est de renvoyer null. Bien sûr, si le champ parent lui-même est non nullable, ce comportement est propagé dans l'arborescence jusqu'à ce qu'un champ nullable soit finalement rencontré.

Alors, pourquoi obtenez-vous cette erreur ? Parce que votre résolveur pour operatingAirline ne renvoie pas null. Il renvoie un genre d'objet (soit un objet airline incomplet, un tableau, une chaîne ou autre chose) que GraphQL essaie alors effectivement de coercer en type Airline. Le champ id a été demandé, mais il se résout à null en fonction de l'objet renvoyé par le résolveur de operatingAirline. Puisque le champ id a été demandé et renvoyé à null, le champ operatingAirline entier échoue à la validation et renvoie null.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X