web-dev-qa-db-fra.com

Passer le champ obtenu à une autre requête dans GraphQL

Imaginez la requête suivante:

query {
  user {
    id
  }
  SomeOtherStuff(id: <--- I want to pass the id obtained from user) {
    id
  }
}

Comment passez-vous un paramètre obtenu d'une requête à une autre?

16
Adam Wolski

Dans GraphQL, les champs à chaque "niveau" de la demande sont exécutés et résolus en parallèle. Dans votre exemple, user et SomeOtherStuff sont tous deux des champs du même type (le type racine Query) - ils seront donc résolus en même temps. Cela signifie que chaque requête n'est essentiellement pas au courant de l'autre ou de ce que l'autre a résolu.

Vous devez gérer ce type de scénario côté client. En d'autres termes, demandez d'abord à l'utilisateur, analysez la réponse pour l'ID, puis effectuez la deuxième demande.

Edit: Dans Apollo, vous utiliseriez la composition à cet effet:

const userQuery = gql`query User { user { id } }`;
const stuffQuery = gql`query SomeOtherStuff($id: ID) { someOtherStuff(id: $id){ stuff } }`;

export default compose(
  graphql(userQuery, { name: 'userData' })
  graphql(stuffQuery, { name: 'stuffData', options: ({userData:{id}={}}) => ({variables: {id}}) }),
)(YourComponent)
9
Daniel Rearden

Je suis d'accord avec @DanielRearden. Vous devez créer des résolveurs de type afin de pouvoir aller à l'infini dans le graphique. J'ai fait un simple exemple de serveur ici qui montre des relations profondes. Parce que tous les champs de nom sont des références, cela va infiniment profondément pour n'importe quelle requête.

Avec ce serveur, vous pouvez exécuter une requête comme celle-ci, par exemple:

{
  hero {
    name
    friends {
      name
      friends {
        name
        friends {
          name
          friends: {
            name
          }
        }
      }
    }
  }
}

Donc, dans votre exemple, structurez-le comme ceci:

query {
  user {
    id
    otherStuff {
      id
    }
  }
}
4
konsumer