0
0
GraphQLquery~5 mins

Context setup in GraphQL

Choose your learning style9 modes available
Introduction

Context setup helps share information like user details or database connections across all parts of a GraphQL server.

When you want to know which user is making a request to check permissions.
When you need to reuse a database connection for all queries in one request.
When you want to pass common data like language or timezone to all resolvers.
When you want to log or track requests with shared info.
When you want to keep your code clean by avoiding passing data manually to every resolver.
Syntax
GraphQL
const server = new ApolloServer({
  typeDefs,
  resolvers,
  context: ({ req }) => {
    // create and return context object
    return { user: getUserFromReq(req), db };
  }
});

The context function runs for every request and returns an object shared by all resolvers.

You can add anything to context like user info, database clients, or helpers.

Examples
Simple context with a database client shared to all resolvers.
GraphQL
context: () => ({ db: myDatabaseClient })
Context that extracts user info from request headers for authentication.
GraphQL
context: ({ req }) => {
  const user = authenticate(req.headers.authorization);
  return { user };
}
Async context example to fetch user data before resolvers run.
GraphQL
context: async ({ req }) => {
  const user = await getUserFromToken(req.headers.token);
  return { user };
}
Sample Program

This example sets up a GraphQL server with context that reads user info from request headers. The query returns the current user's name or 'Guest' if no user is found.

GraphQL
const { ApolloServer, gql } = require('apollo-server');

const typeDefs = gql`
  type Query {
    currentUserName: String
  }
`;

const resolvers = {
  Query: {
    currentUserName: (parent, args, context) => {
      return context.user ? context.user.name : 'Guest';
    }
  }
};

function getUserFromReq(req) {
  // Simulate user extraction
  if (req.headers.authorization === 'secret-token') {
    return { name: 'Alice' };
  }
  return null;
}

const server = new ApolloServer({
  typeDefs,
  resolvers,
  context: ({ req }) => {
    const user = getUserFromReq(req);
    return { user };
  }
});

// Simulate a request with authorization header
const fakeReq = { headers: { authorization: 'secret-token' } };

server.executeOperation({
  query: '{ currentUserName }',
  contextValue: server.context({ req: fakeReq })
}).then(response => {
  console.log(response.data.currentUserName);
});
OutputSuccess
Important Notes

Context runs once per request, so avoid putting heavy operations inside it.

Always return a plain object from context for easy access in resolvers.

You can pass extra info like loaders or helpers in context to keep resolvers clean.

Summary

Context shares data like user info or database clients across all resolvers.

It runs once per request and returns an object accessible in every resolver.

Use context to keep your GraphQL server organized and secure.