What if you could share important info instantly with every part of your app without repeating yourself?
Why Context argument in GraphQL? - Purpose & Use Cases
Imagine you are building a GraphQL API where each request needs to know who the user is and what permissions they have. Without a shared place to keep this info, every resolver would have to ask for user details separately, like calling different people in a big office to get the same info.
This manual way is slow and confusing. You might forget to pass user info to some parts, causing errors or security holes. It's like repeating the same instructions over and over, risking mistakes and wasting time.
The context argument in GraphQL acts like a shared folder on a desk that everyone can access during a request. It holds important info like user identity and settings, so every resolver can easily check it without extra calls or confusion.
function resolver(args, user) {
// each resolver needs user info passed explicitly
if (!user) throw new Error('No user');
// ...
}function resolver(args, context) {
// user info is inside context, always available
if (!context.user) throw new Error('No user');
// ...
}It enables smooth, secure, and efficient data fetching by sharing important info across all parts of a GraphQL request.
When a user logs into a shopping app, the context argument carries their login info and preferences so every part of the app knows who they are and what they can do, without asking repeatedly.
Manual passing of user info is slow and error-prone.
Context argument provides a shared space for request-wide info.
This makes resolvers simpler, safer, and faster.
Practice
context argument in GraphQL resolvers?Solution
Step 1: Understand the role of context in GraphQL
The context argument is designed to hold data shared by all resolvers during a single request, such as authentication info or database connections.Step 2: Compare with other options
Defining schema types, specifying operation types, or formatting responses are handled elsewhere, not by context.Final Answer:
To share common data like authentication or database access across all resolvers during a request -> Option DQuick Check:
Context = Shared data for resolvers [OK]
- Confusing context with schema definition
- Thinking context formats responses
- Assuming context defines operation types
context argument in a GraphQL resolver function?Solution
Step 1: Recall resolver function signature
GraphQL resolvers receive arguments in the order: parent, args, context.Step 2: Match the correct order
Only resolver(parent, args, context) { ... } matches this order correctly.Final Answer:
resolver(parent, args, context) { ... } -> Option AQuick Check:
Resolver args order = parent, args, context [OK]
- Swapping context and args positions
- Omitting the parent argument
- Using only two arguments instead of three
const resolver = (parent, args, context) => {
return context.db.getUserById(args.id);
};What will
resolver(null, {id: 5}, context) return if context.db.getUserById(5) returns { id: 5, name: 'Alice' }?Solution
Step 1: Understand the resolver call
The resolver callscontext.db.getUserByIdwithargs.idwhich is 5.Step 2: Check the return value from context
Givencontext.db.getUserById(5)returns{ id: 5, name: 'Alice' }, the resolver returns this object.Final Answer:
{ id: 5, name: 'Alice' } -> Option BQuick Check:
Resolver returns context.db.getUserById(args.id) result [OK]
- Assuming resolver returns null or undefined
- Confusing parent argument with context
- Expecting an error without checking context structure
const resolver = (parent, args, context) => {
return context.getUser(args.id);
};If running this code causes
TypeError: context.getUser is not a function, what is the most likely cause?Solution
Step 1: Analyze the error message
The error saysgetUseris not a function oncontext, meaningcontext.getUseris undefined or not callable.Step 2: Check other options
Undefinedargs.idor missing parent won't cause this specific error. Missing args parameter would cause a different error.Final Answer:
The context object does not have a getUser method -> Option AQuick Check:
TypeError means missing method on context [OK]
- Blaming args.id for method not found error
- Assuming parent argument causes this error
- Ignoring that context must have the method
context argument. Which approach correctly sets up the context for this purpose?Solution
Step 1: Understand context usage for shared data
Context is designed to be created once per request and shared with all resolvers, perfect for authentication info.Step 2: Evaluate other options
Defining user info inside each resolver duplicates code; passing user info as query args is insecure and inconvenient; global variables are unsafe for concurrent requests.Final Answer:
Create context once per request including user info, then pass it to all resolvers -> Option CQuick Check:
Context = single shared object per request [OK]
- Duplicating user info in every resolver
- Passing sensitive info as query arguments
- Using global variables causing data leaks
Ready to prove it?
Pass the test and this pattern moves unknown
