Apollo Server 2 is officially end-of-life as of 22 October 2023.

Learn more about upgrading.

Integrating with Node.js middleware

Use Apollo Server with Express, Koa, and more


Apollo Server integrates easily with several popular Node.js middleware libraries. To integrate, first install the appropriate package from the table below instead of the core apollo-server package:

MiddlewarePackage
Expressapollo-server-express
AWS Lambdaapollo-server-lambda
Koaapollo-server-koa
hapiapollo-server-hapi
Microapollo-server-micro
Fastifyapollo-server-fastify
Google Cloud Functionsapollo-server-cloud-functions
Azure Functionsapollo-server-azure-functions
Cloudflareapollo-server-cloudflare

If you've already installed the core apollo-server package, you can npm uninstall it after installing an integration package.

Applying middleware

When integrating with middleware, first you initialize Apollo Server just like you always do, and then you call applyMiddleware.

Here's a basic Express example that serves Hello! from every path except /graphql, which serves a GraphQL endpoint with Apollo Server:

JavaScript
1const express = require('express');
2const { ApolloServer } = require('apollo-server-express');
3const { typeDefs, resolvers } = require('./schema');
4
5async function startApolloServer() {
6  const app = express();
7  const server = new ApolloServer({
8    typeDefs,
9    resolvers,
10  });
11  await server.start();
12
13  server.applyMiddleware({ app });
14
15  app.use((req, res) => {
16    res.status(200);
17    res.send('Hello!');
18    res.end();
19  });
20
21  await new Promise(resolve => app.listen({ port: 4000 }, resolve));
22  console.log(`🚀 Server ready at http://localhost:4000${server.graphqlPath}`);
23  return { server, app };
24}

The parameter you provide to applyMiddleware is your middleware's top-level representation of your application. In Express applications, this variable is commonly named app.

When you pass your app to applyMiddleware, Apollo Server automatically configures various middleware (including body parsing, the GraphQL Playground frontend, and CORS support), so you don't need to apply them with a mechanism like app.use.

Note: When integrating with hapi, call applyMiddleware with await.

Feedback

Edit on GitHub

Forums