Apollo Server Context Undefined Fix

If you are building a GraphQL API using Node.js, Express, and Apollo Server, you may suddenly face an issue where context becomes undefined.
This is one of the most common problems developers face while implementing authentication, JWT verification, database models, or request headers inside GraphQL resolvers.
The good news is that the issue is usually caused by a small configuration mistake.
In this complete beginner-friendly guide, you will learn:
- Why Apollo Server context becomes undefined
- How Apollo Server context works
- How to correctly configure context
- Common mistakes developers make
- JWT authentication example
- Best practices for production applications
- Debugging tips
This guide focuses on the Apollo Server context undefined fix using:
- Node.js
- Express.js
- Apollo Server
- GraphQL
What is Apollo Server Context?
Apollo Server context is a shared object available inside every GraphQL resolver.
It is mainly used for:
- Authentication
- Current user data
- Database models
- Request headers
- Request-specific information
Example:
context: async ({ req }) => {
return {
user: req.user,
};
}Code language: JavaScript (javascript)Then inside resolver:
Query: {
me: (_, __, context) => {
return context.user;
},
}Code language: CSS (css)If the context is not configured correctly, you may get errors like:
Cannot read properties of undefinedCode language: JavaScript (javascript)or
context is undefinedCode language: JavaScript (javascript)Why Apollo Server Context Becomes Undefined
The Apollo Server context undefined issue usually happens because of:
- Missing context function
- Wrong middleware configuration
- Incorrect Express integration
- Using Apollo Server v4 incorrectly
- Forgetting to return context object
- Wrong parameter destructuring
- Authentication middleware issues
Let us fix them step by step.
Apollo Server Context Undefined Fix Using Express
Step 1: Install Required Packages
Install dependencies:
npm install express graphql @apollo/server
npm install cors body-parser
npm install @as-integrations/express5Code language: JavaScript (javascript)Step 2: Create Basic Apollo Server
Create server.js
import express from "express";
import cors from "cors";
import bodyParser from "body-parser";
import { ApolloServer } from "@apollo/server";
import { expressMiddleware } from "@as-integrations/express5";
const typeDefs = `#graphql
type Query {
message: String
}
`;
const resolvers = {
Query: {
message: (_, __, context) => {
console.log(context);
return "Apollo Server Running";
},
},
};
const app = express();
const server = new ApolloServer({
typeDefs,
resolvers,
});
await server.start();
app.use(
"/graphql",
cors(),
bodyParser.json(),
expressMiddleware(server, {
context: async ({ req }) => {
return {
token: req.headers.authorization || "",
};
},
})
);
app.listen(4000, () => {
console.log("Server running on port 4000");
});Code language: JavaScript (javascript)This is the correct Apollo Server context configuration.
Step 3: Test GraphQL Query
Open:
http://localhost:4000/graphqlCode language: JavaScript (javascript)Run query:
query {
message
}You should see:
{
"data": {
"message": "Apollo Server Running"
}
}Code language: JSON / JSON with Comments (json)Common Reason 1: Forgetting Context Function
Wrong:
expressMiddleware(server)Correct:
expressMiddleware(server, {
context: async ({ req }) => ({
token: req.headers.authorization,
}),
})Code language: JavaScript (javascript)Without the context function, resolvers may receive undefined values.
Common Reason 2: Wrong Resolver Parameters
Many beginners write:
message: (context) => {
console.log(context);
}Code language: JavaScript (javascript)This is wrong.
Resolver parameters are:
(parent, args, context, info)Code language: PHP (php)Correct:
message: (_, __, context) => {
console.log(context);
}Code language: JavaScript (javascript)Common Reason 3: Not Returning Object
Wrong:
context: async ({ req }) => {
token: req.headers.authorization;
}Code language: JavaScript (javascript)This returns undefined.
Correct:
context: async ({ req }) => {
return {
token: req.headers.authorization,
};
}Code language: JavaScript (javascript)or
context: async ({ req }) => ({
token: req.headers.authorization,
})Code language: JavaScript (javascript)Apollo Server Context Undefined Fix with JWT Authentication
Authentication is the most common place where context is used.
Install JWT package:
npm install jsonwebtokenJWT Authentication Example
Create Context
import jwt from "jsonwebtoken";
context: async ({ req }) => {
const authHeader = req.headers.authorization || "";
const token = authHeader.replace("Bearer ", "");
let user = null;
if (token) {
try {
user = jwt.verify(token, "SECRET_KEY");
} catch (error) {
console.log("Invalid token");
}
}
return {
user,
};
}Code language: JavaScript (javascript)Use User Inside Resolver
const resolvers = {
Query: {
profile: (_, __, context) => {
if (!context.user) {
throw new Error("Unauthorized");
}
return "Protected Profile Data";
},
},
};Code language: JavaScript (javascript)Common Reason 4: Using Apollo Server v4 Incorrectly
Apollo Server v4 changed Express integration.
Old version:
server.applyMiddleware({ app });New version:
app.use(
"/graphql",
expressMiddleware(server)
);Code language: PHP (php)If you follow old tutorials with Apollo Server v4, the context may become undefined.
Always use:
@as-integrations/express5Code language: JavaScript (javascript)for modern Express integration.
Official Apollo documentation:
Common Reason 5: Middleware Order Problems
Wrong middleware order can also break context.
Wrong:
app.use(expressMiddleware(server));
app.use(bodyParser.json());Code language: PHP (php)Correct:
app.use(
bodyParser.json(),
expressMiddleware(server)
);Code language: CSS (css)Always parse request body before GraphQL middleware.
Apollo Server Context with Database Models
You can also pass database models through context.
Example with MongoDB:
context: async () => {
return {
UserModel,
ProductModel,
};
}Code language: JavaScript (javascript)Resolver:
users: async (_, __, context) => {
return context.UserModel.find();
}Code language: JavaScript (javascript)This pattern is widely used in production GraphQL applications.
Best Practices for Apollo Server Context
Keep Context Lightweight
Do not place huge objects inside context.
Good:
{
user,
models,
}Bad:
{
hugeDatabaseDump,
}Avoid Business Logic in Context
Context should only prepare shared data.
Do not write complex logic there.
Use Async Context
Always use async context:
context: async ({ req }) => {
return {};
}Code language: JavaScript (javascript)This helps future scalability.
Handle Authentication Errors Gracefully
Wrong:
jwt.verify(token, SECRET);Code language: CSS (css)Correct:
try {
jwt.verify(token, SECRET);
} catch (error) {
console.log(error);
}Code language: JavaScript (javascript)Common Mistakes Developers Make
Using Wrong Header Name
Wrong:
req.headers.AuthorizationCode language: CSS (css)Correct:
req.headers.authorizationCode language: CSS (css)Headers are lowercase in Node.js.
Forgetting Bearer Token Removal
Wrong:
jwt.verify(authHeader, SECRET);Code language: CSS (css)Correct:
const token = authHeader.replace("Bearer ", "");Code language: JavaScript (javascript)Not Passing Cookies
If using cookies:
credentials: "include"Code language: JavaScript (javascript)must be enabled on frontend requests.
Debugging Apollo Server Context Undefined
Log Context
Inside resolver:
console.log(context);Code language: JavaScript (javascript)Log Headers
Inside context:
context: async ({ req }) => {
console.log(req.headers);
return {};
}Code language: JavaScript (javascript)Test with Postman
Send:
Authorization: Bearer TOKENCode language: HTTP (http)inside request headers.
Folder Structure Example
project/
│
├── server.js
├── schema/
│ └── typeDefs.js
├── resolvers/
│ └── resolvers.js
├── middleware/
│ └── auth.js
├── models/
│ └── User.js
└── package.jsonA clean folder structure helps avoid configuration mistakes.
Conclusion
The Apollo Server context undefined fix is usually simple once you understand how Apollo Server middleware works.
Most issues happen because of:
- Missing context function
- Wrong resolver parameters
- Incorrect Express integration
- Middleware order issues
- Apollo Server version mismatch
The best approach is:
- Configure context correctly
- Return proper objects
- Use async functions
- Test request headers carefully
- Log values during debugging
Once your context works correctly, implementing authentication, database access, and request handling becomes much easier.
If you are building production GraphQL applications using Node.js and Express, mastering Apollo Server context is extremely important.
A properly configured context system makes your application:
- Cleaner
- More secure
- Easier to scale
- Easier to debug
That is why understanding the Apollo Server context undefined fix is a must for every GraphQL developer.