📖 Scenario: You are building a simple GraphQL API for a bookstore. The API needs to provide information about books and authors.To keep your code clean and easy to maintain, you want to organize your GraphQL resolvers properly.
🎯 Goal: Build a well-organized set of GraphQL resolvers separated by type (Query, Book, Author) to fetch book and author data.
📋 What You'll Learn
Create a books array with 3 books, each having id, title, and authorId
Create an authors array with 2 authors, each having id and name
Create a resolvers object with three keys: Query, Book, and Author
In Query, add a resolver books that returns the books array
In Book, add a resolver author that returns the author object matching the book's authorId
In Author, add a resolver books that returns all books written by that author
💡 Why This Matters
🌍 Real World
Organizing resolvers by type is a common practice in real GraphQL APIs to keep code modular and easy to understand.
💼 Career
Understanding resolver organization is essential for backend developers working with GraphQL to build scalable and maintainable APIs.
Progress0 / 4 steps
1
Create the initial data arrays
Create an array called books with these exact objects: { id: '1', title: '1984', authorId: 'a1' }, { id: '2', title: 'Animal Farm', authorId: 'a1' }, and { id: '3', title: 'Brave New World', authorId: 'a2' }. Also create an array called authors with these exact objects: { id: 'a1', name: 'George Orwell' } and { id: 'a2', name: 'Aldous Huxley' }.
GraphQL
Hint
Use const books = [...] and const authors = [...] to create the arrays with the exact objects.
2
Create the resolver object with Query type
Create a resolvers object. Inside it, add a Query object with a resolver function books that returns the books array.
GraphQL
Hint
Inside resolvers, add Query: { books: () => books } to return the books array.
3
Add the Book type resolver for author
Inside the resolvers object, add a Book object. Add a resolver function author that takes book as an argument and returns the author object from authors whose id matches book.authorId.
Inside the resolvers object, add an Author object. Add a resolver function books that takes author as an argument and returns an array of books from books whose authorId matches author.id.
What is the main problem with this resolver organization?
medium
A. The schema is missing a Subscription resolver
B. The Post.author resolver ignores the parent post and fetches unrelated author data
C. Resolvers must be async functions, but these are not
D. The Query.posts resolver should be inside Mutation
Solution
Step 1: Analyze Post.author resolver
The author resolver does not use the parent post argument, so it cannot fetch the correct author for each post.
Step 2: Understand resolver context
Field resolvers should use the parent argument to access related data; ignoring it causes wrong or unrelated data.
Final Answer:
The Post.author resolver ignores the parent post and fetches unrelated author data -> Option B
Quick Check:
Use parent argument in nested resolvers [OK]
Hint: Nested resolvers must use parent to access related data [OK]
Common Mistakes:
Ignoring parent argument in nested resolvers
Misplacing Query resolvers inside Mutation
Assuming all resolvers must be async
5. You want to organize resolvers for a GraphQL server with Queries, Mutations, and a custom type Book. Which structure below best supports maintainability and scalability?
hard
A. const resolvers = { Query: {...}, Mutation: {...} }; // no Book resolvers