5 votes

Arguments de requête optionnels GraphQL

Je sais que vous pouvez définir des valeurs par défaut pour les arguments dans un schéma, mais est-il possible de faire en sorte que l'argument limit argument complètement facultatif dans mon schéma GraphQL ?

Pour l'instant, il semble que lorsque j'appuie sur cette touche sans spécifier de limite, je pense que c'est pour cela que j'obtiens Int cannot represent non-integer value: undefined

const schema = buildSchema(`
  companies(limit: Int): [Company]
...)

enter image description here

Je veux pouvoir sauter la limite pour qu'il y ait toutes les entreprises.

En JS, je l'appelle comme ça :

query: `query { 
          companies(limit: ${limit}) {
 ...

mais parfois je ne veux pas spécifier de limite. Donc ce qui se passe, c'est que le client envoie crafters(limit: undefined) et il essaie probablement de le convertir en Int. Je ne sais pas comment ne pas envoyer limit et comment rendre ce paramètre entier facultatif.

(J'ai également lu que dans le client Je devrais plutôt spécifier les arguments comme variables comme query($limit: Int) { companies(limit: $limit) { Je suppose que d'après mon client , de JS ? Si oui, comment dois-je envoyer ma limite ? Variable JS dans ce domaine ?

9voto

Daniel Rearden Points 8834

Les arguments dans GraphQL sont nullables (c'est-à-dire optionnels) par défaut. Donc si votre définition de type ressemble à ceci :

companies(limit: Int): [Company]

il n'y a rien d'autre que vous devez faire pour rendre limit facultatif - il l'est déjà. Si vous vouliez rendre limit nécessaire, vous devez le rendre non nul en ajoutant un élément ! au type comme ceci :

companies(limit: Int!): [Company]

Les erreurs que vous rencontrez n'ont rien à voir avec le type d'objet de l'enquête. limit argument. Le problème vient de la requête que vous envoyez, qui, d'après les messages d'erreur, ressemble à quelque chose comme ceci :

query ($limit: Int){
  companies (limit: undefined) {
    # ...
  }
}

Il y a deux problèmes ici : Premièrement, vous définissez une variable ($limit) que vous n'utilisez jamais dans la requête (comme l'indique la deuxième erreur). Deuxièmement, vous définissez la limite à undefined ce qui n'est pas un littéral valide en GraphQL.

Au lieu d'utiliser l'interpolation de chaînes de caractères, vous devez utiliser des variables pour transmettre toute valeur dynamique à votre requête. Par exemple :

query ($limit: Int){
  companies (limit: $limit) {
    # ...
  }
}

Si la variable est nullable (remarquez que nous avons utilisé Int au lieu de Int! ), il peut être entièrement omis de la requête, rendant ainsi la valeur de l'argument indéfinie côté serveur. La façon dont vous envoyez vos requêtes au serveur n'est pas claire, mais en supposant que vous n'utilisez pas une bibliothèque client, vous pouvez consulter la documentation suivante aquí pour savoir comment structurer votre demande. Sinon, consultez la documentation de votre bibliothèque pour savoir comment utiliser correctement les variables dans votre requête.

0voto

Greg Brodzik Points 1257

Vous trouverez ci-dessous un exemple de la façon dont vous pouvez définir une requête sur le client et passer un argument non obligatoire. Je ne suis pas sûr de votre configuration côté client, mais vous pouvez utiliser une librairie comme graphql-tag pour convertir la chaîne en AST.

const GET_COMPANIES = gql`
  query Companies($limit: Int) {
    companies(limit: $limit) {
      ... // return fields
    }
  }
`;

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