Erreurs
Comment éviter les erreurs sur les mutations en vérifiant actions et dépréciations, et comment lire le champ errors que la plupart d’entre elles renvoient.
Une mutation peut échouer pour bien des raisons : l’objet n’existe pas, l’utilisateur n’en a pas le droit, une valeur est invalide. L’API vous donne deux moyens d’éviter la plupart des échecs et un moyen de lire les autres.
Vérifier d’abord les actions
La plupart des types d’objet soumis à des droits ont un objet ...Actions associé. Il indique, sous forme de booléens, ce que l’utilisateur courant peut faire avec cet objet.
Une Story a un StoryActions. Avant d’appeler storyDelete, vérifiez que actions.delete vaut true :
query {
story(slug: 123) {
actions {
edit
delete
}
}
}
Surveiller les dépréciations
Des champs sont parfois dépréciés, puis supprimés. Le schéma les signale comme tels, et un client GraphQL vous le montre. Vérifiez régulièrement que les champs que vous utilisez existent encore : une requête qui demande un champ supprimé échoue entièrement.
Lire le champ errors
Presque toutes les mutations renvoient un champ errors. C’est la liste des erreurs rencontrées pendant son exécution. Chaque entrée implémente l’interface MutationError. Son unique champ, path, indique le champ d’entrée en cause. Chaque mutation a son propre ensemble de types d’erreur possibles, et __typename vous dit lequel s’est produit.
Demandez ce champ dans chaque mutation qui le possède :
mutation storyBroadcast($input: StoryBroadcastInput!) {
storyBroadcast(input: $input) {
story {
id
}
errors {
__typename
... on MutationError {
path
}
}
}
}
Les variables, avec un identifiant de story qui n’existe pas :
{
"input": {
"id": "NOT_A_STORY_ID",
"recipients": ["USER_ID"]
}
}
La réponse indique le type d’erreur et le champ en cause :
{
"data": {
"storyBroadcast": {
"story": null,
"errors": [
{
"__typename": "ObjectNotFoundError",
"path": "input.id"
}
]
}
}
}
ObjectNotFoundError sur input.id signifie que l’identifiant de story n’a pas été trouvé. Certains types d’erreur portent d’autres champs que path. Pour les lire, ajoutez un fragment sur ce type. Par exemple, TooManyRecipientsError, une autre erreur possible de storyBroadcast, porte aussi nRecipients.