web-dev-qa-db-fra.com

GraphQL - Comment répondre avec un code d'état différent?

J'ai un problème avec Graphql et Apollo Client.

J'ai toujours créé différentes réponses comme le code 401 lorsque j'utilise REST, mais je ne sais pas comment adopter un comportement similaire.

Quand je reçois la réponse, je veux que cela passe à la fonction catch. J'ai ce code à l'avant:

client.query({
  query: gql`
    query TodoApp {
      todos {
        id
        text
        completed
      }
    }
  `,
})
  .then(data => console.log(data))
  .catch(error => console.error(error));

Quelqu'un peut-il m'aider?

7
slorenzo

Le moyen de retourner les erreurs dans GraphQL (au moins dans graphql-js) consiste à insérer des erreurs dans les fonctions de résolution. Étant donné que les codes d'état HTTP sont spécifiques au transport HTTP et que GraphQL ne s'intéresse pas à ce transport, vous ne pouvez pas y définir le code d'état. Au lieu de cela, vous pouvez générer une erreur spécifique dans votre fonction de résolution:

age: (person, args) => {
  try {
    return fetchAge(person.id);
  } catch (e) {
    throw new Error("Could not connect to age service");
  }
}

Les erreurs GraphQL sont envoyées au client dans la réponse comme suit:

{
  "data": {
    "name": "John",
    "age": null
  },
  "errors": [
    { "message": "Could not connect to age service" }
  ]
}

Si le message ne contient pas suffisamment d'informations, vous pouvez créer une classe d'erreurs spéciale pour votre serveur GraphQL comprenant un code d'état. Pour vous assurer que le code d'état est bien inclus dans votre réponse, vous devez spécifier la fonction formatError lors de la création du middleware:

app.use('/graphql', bodyParser.json(), graphqlExpress({ 
    schema: myGraphQLSchema,
    formatError: (err) => ({ message: err.message, status: err.status }),
}));
16
helfer

Un ajout récent à la spec concernant les sorties d'erreur: 

Les services GraphQL peuvent fournir une entrée supplémentaire aux erreurs avec la clé extensions . Cette entrée, si définie, doit avoir une carte comme valeur. Cette entrée est réservée aux développeurs pour ajouter des informations supplémentaires aux erreurs, mais ils sont jugés utiles et aucune restriction supplémentaire ne s'applique à son contenu.

Maintenant, en utilisant le champ extensions, vous pouvez personnaliser les informations lisibles par machine dans vos entrées errors:

{
  "errors": [
    {
      "message": "Name for character with ID 1002 could not be fetched.",
      "locations": [ { "line": 6, "column": 7 } ],
      "path": [ "hero", "heroFriends", 1, "name" ],
      "extensions": {
        "code": "CAN_NOT_FETCH_BY_ID",
        "timestamp": "Fri Feb 9 14:33:09 UTC 2018"
      }
    }
  ]
}

La dernière version de Apollo-Server est conforme aux spécifications avec cette fonctionnalité, vérifiez-la Ici .

2
Glenn Sonna