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?
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)
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
}
}
}