How to create a nested resolver in apollo graphql server

Given the following graphical diagram of the apollo server, I wanted to split them into separate modules, so I donโ€™t need the authorโ€™s request in the root of the request .. and I want it to be divided. So I added another layer called authorQueries before adding it to Root Query

type Author { id: Int, firstName: String, lastName: String } type authorQueries { author(firstName: String, lastName: String): Author } type Query { authorQueries: authorQueries } schema { query: Query } 

I tried the following: you can see that authorQueries was added as another layer before the author function is specified.

 Query: { authorQueries :{ author (root, args) { return {} } } } 

When querying in Graphiql, I also added an extra layer.

 { authorQueries { author(firstName: "Stephen") { id } } } 

I get the following error.

"message": "Resolve function for \"Query.authorQueries\" returned undefined",

+12
graphql apollo-server
source share
3 answers

To create a nested resolver, simply define a resolver for the return type of the parent field. In this case, your authorQueries field returns the type authorQueries , so you can put your resolver there:

 { Query: { authorQueries: () => ({}) }, authorQueries: { author(root, args) { return "Hello, world!"; } } } 

Thus, in the technical sense, there is no such thing as a nested resolver โ€” each type of object has a flat list of fields, and these fields have return types. GraphQL query nesting is what makes the result nested.

+15
source share

I found that returning functions in parent fields that return a type results in binding this argument and violates the recognizer interface, since the nested converter is not parent as the first argument.

For inline type definitions

 import { graphql, } from 'graphql'; import { makeExecutableSchema, IResolverObject } from 'graphql-tools'; const types = ' type Query { person: User } type User { id: ID name: String, dog(showCollar: Boolean): Dog } type Dog { name: String } '; const User: IResolverObject = { dog(obj, args, ctx) { console.log('Dog Arg 1', obj); return { name: 'doggy' }; } }; const resolvers = { User, Query: { person(obj) { console.log('Person Arg 1', obj); return { id: 'foo', name: 'bar', }; } } }; const schema = makeExecutableSchema({ typeDefs: [types], resolvers }); const query = '{ person { name, dog(showCollar: true) { name } } }'; graphql(schema, query).then(result => { console.log(JSON.stringify(result, null, 2)); }); // Person Arg 1 undefined // Dog Arg 1 { id: 'foo', name: 'bar' } // { // "data": { // "person": { // "name": "bar", // "dog": { // "name": "doggy" // } // } // } // } 

You can also use addResolveFunctionsToSchema as shown below.

https://gist.github.com/blugavere/4060f4bf2f3d5b741c639977821a254f

0
source share

I also encounter such a problem, but still can not solve at my end. Any inputs would be helpful.

I filed an error on graphql-tools on github, but have not received a response yet.

https://github.com/apollographql/graphql-tools/issues/1026 .

Hello team

The nested fields of my schema are not called during the request.

scheme

 type XYZ { title: String } type NestedLevel1 { reference: XYZ } type ABCD { title: String reference: XYZ nestedLevel1: NestedLevel1 } type Query { ABCDList(limit: Int, skip: Int): [ABCD] } 

// Resolvers

 const Resolvers = { Query: { ABCDList: () => [] }, ABCD: { reference: () => [] // this function is being called nestedLevel1: { reference: () => [] // this function is not being called } } } 

The top-level reference resolver function is called, but not the nestedLevel1.reference solver.

0
source share

All Articles