web-dev-qa-db-fra.com

GraphQL: tableau / liste non nullable

J'apprends GraphQL maintenant et en parcourant le tutoriel, j'ai rencontré un comportement que je ne peux pas comprendre. Disons que nous avons défini le type dans le schéma:

type Link {
  id: ID!
  url: String!
  description: String!
  postedBy: User
  votes: [Vote!]!
}

En raison de documents votes: [Vote!]! signifie que ce champ doit être non nullable et que le tableau lui-même doit être non nullable également. Mais juste après que l'auteur du tutoriel montre un exemple de requête et pour certains liens, il retourne un tableau vide pour le champ votes. Comme ça:

{
 "url": "youtube.com",
 "votes": []
},
{
 "url": "agar.io",
 "votes": []
}

Donc ma question est: "non-nullable" ne signifie-t-il pas "vide" dans le schéma graphQL ou c'est juste une sorte de mauvais comportement du serveur graphQL (je veux dire qu'il retourne un tableau de rien sans avertir qu'il devrait y avoir quelque chose en raison du schéma) .

Merci!

16
DefLee

Non nul signifie exactement à quoi cela ressemble - pas nul. Un tableau vide n'est pas nul - il renvoie toujours une valeur.

Voici un tableau récapitulatif:

declaration accepts: | null | []   | [null] | [{foo: 'BAR'}]
------------------------------------------------------------------------
[Vote!]!             | no   | yes  | no     | yes
[Vote]!              | no   | yes  | yes    | yes
[Vote!]              | yes  | yes  | no     | yes
[Vote]               | yes  | yes  | yes    | yes

[Vote!]! signifie que le champ (dans ce cas votes) ne peut pas retourner null et qu'il doit résoudre en un tableau et qu'aucun des éléments individuels à l'intérieur de ce tableau ne peut être nul. Donc [] et [{}] et [{foo: 'BAR'}] serait tout valide (en supposant que foo n'est pas nul). Cependant, le le ferait throw: [{foo: 'BAR'}, null]

[Vote]! signifie que le champ ne peut pas retourner null, mais tout élément individuel dans la liste retournée peut être null.

[Vote!] signifie que le champ entier peut être nul, mais s'il renvoie une valeur, il a besoin d'un tableau et chaque élément de ce tableau ne peut pas être nul.

[Vote] signifie que le champ entier peut être nul, mais s'il renvoie une valeur, il a besoin d'un tableau. Cependant, tout membre du tableau peut également être nul.

Si vous devez vérifier si un tableau est vide, vous devez le faire dans votre logique de résolveur. Si vous voulez que GraphQL lance toujours lorsqu'un tableau est vide, demandez simplement à votre résolveur de renvoyer une promesse rejetée.

Pour plus d'informations, vous pouvez lire la section liste et non null de l'introduction GraphQL ou jetez un œil à spec .

40
Daniel Rearden