What if you never had to pass user info manually again in your GraphQL app?
Why Context setup in GraphQL? - Purpose & Use Cases
Imagine you are building a web app where users log in and you need to check their identity on every request manually by passing user info everywhere.
You have to send user details through many layers of your code, repeating the same checks and data passing again and again.
This manual passing of user info is slow and messy.
It's easy to forget to pass the data somewhere, causing bugs.
It also makes your code hard to read and maintain because the user data is everywhere.
Context setup in GraphQL lets you store shared info like user identity once per request.
Then, all parts of your GraphQL server can access this info easily without passing it around manually.
This keeps your code clean, safe, and easier to manage.
function resolver(args, user) { /* must pass user every time */ }function resolver(args, context) { const user = context.user; /* access user from context */ }It enables secure, clean, and efficient access to shared data like authentication info throughout your GraphQL server.
When a user sends a request, their login info is stored in context once, so every resolver can check permissions without extra code.
Manual data passing is error-prone and messy.
Context setup centralizes shared info per request.
This makes your GraphQL server code cleaner and safer.
Practice
context in a GraphQL server?Solution
Step 1: Understand what context provides
Context is an object that runs once per request and is accessible in every resolver, allowing shared data like user info or database clients.Step 2: Compare with other options
Defining schema types, writing resolvers, and formatting responses are separate tasks not handled by context.Final Answer:
To share data like user info or database clients across all resolvers -> Option AQuick Check:
Context shares data across resolvers [OK]
- Confusing context with schema definition
- Thinking context formats responses
- Assuming context writes resolver logic
Solution
Step 1: Recall Apollo Server context syntax
Context is defined as a function returning an object, e.g.,context: () => ({ user: getUser() }).Step 2: Identify syntax errors in other options
context = { user: getUser() } uses assignment instead of a function, C uses an object directly without a function, and D has invalid syntax missing parentheses and braces.Final Answer:
context: () => ({ user: getUser() }) -> Option BQuick Check:
Context is a function returning an object [OK]
- Defining context as a plain object
- Missing parentheses in function syntax
- Using assignment instead of property
context: () => ({ user: { id: 5, name: 'Alice' } })What will be the value of
context.user.name inside a resolver?Solution
Step 1: Analyze the context object
The context function returns an object with auserproperty containing{ id: 5, name: 'Alice' }.Step 2: Access
Accessinguser.namein resolvercontext.user.namewill give the string 'Alice' as defined.Final Answer:
'Alice' -> Option DQuick Check:
context.user.name = 'Alice' [OK]
- Confusing user id with name
- Assuming context is undefined
- Expecting null instead of string
context: () => { user: getUser() }Why does
context.user return undefined in resolvers?Solution
Step 1: Check function return behavior
The function uses curly braces but lacks a return statement, so it returns undefined by default.Step 2: Understand impact on context
Since nothing is returned,context.useris undefined in resolvers.Final Answer:
Because the function does not return the object explicitly -> Option CQuick Check:
Missing return in function = undefined context [OK]
- Omitting return in arrow function with braces
- Assuming getUser() is undefined without checking
- Thinking context must be an object, not function
Solution
Step 1: Understand async context needs
Connecting to a database and fetching user info are asynchronous operations, so context must be async and await these calls.Step 2: Evaluate options for async correctness
context: async () => { const db = await connectDB(); const user = await getUser(); return { db, user }; } correctly uses async function and awaits results before returning an object. context: { db: connectDB(), user: getUser() } is a plain object, not a function. context: () => { db: connectDB(); user: getUser(); } lacks return and awaits. context: () => ({ db: connectDB(), user: getUser() }) returns an object but does not await async calls.Final Answer:
context: async () => { const db = await connectDB(); const user = await getUser(); return { db, user }; } -> Option AQuick Check:
Async context with awaited data [OK]
- Not awaiting async calls in context
- Using plain object instead of function
- Missing return statement in function
Ready to prove it?
Pass the test and this pattern moves unknown
