API Reference: Drain HTTP server plugin
Using the plugin
This API reference documents the ApolloServerPluginDrainHttpServer
plugin.
This plugin is designed for use with apollo-server-express
and other framework-specific packages which are built on top of Node http.Server
s. It is highly recommended that you use this plugin with packages like apollo-server-express
if you want your server to shut down gracefully.
You do not need to explicitly use this plugin with the batteries-included apollo-server
package: that package automatically uses this plugin internally.
When you use this plugin, Apollo Server will drain your HTTP server when you call the stop()
method (which is also called for you when the SIGTERM
and SIGINT
signals are received, unless disabled with the stopOnTerminationSignals
constructor option). Specifically, it will:
Stop listening for new connections
Close idle connections (i.e., connections with no current HTTP request)
Close active connections whenever they become idle
Wait for all connections to be closed
After a grace period, if any connections remain active, forcefully close them.
This plugin is exported from the apollo-server-core
package. It is tested with apollo-server-express
, apollo-server-koa
, and apollo-server-fastify
. (If you're using Hapi, you should instead use the ApolloServerPluginStopHapiServer
plugin exported from the apollo-server-hapi
package.)
Here's a basic example of how to use it with Express. See the framework integrations docs for examples of how to use it with other frameworks.
1const express = require('express');
2const { ApolloServer } = require('apollo-server-express');
3const {
4 ApolloServerPluginDrainHttpServer,
5 ApolloServerPluginLandingPageLocalDefault,
6} = require('apollo-server-core');
7const { typeDefs, resolvers } = require('./schema');
8const http = require('http');
9
10async function startApolloServer() {
11 const app = express();
12 // Our httpServer handles incoming requests to our Express app.
13 // Below, we tell Apollo Server to "drain" this httpServer,
14 // enabling our servers to shut down gracefully.
15 const httpServer = http.createServer(app);
16 const server = new ApolloServer({
17 typeDefs,
18 resolvers,
19 csrfPrevention: true,
20 cache: 'bounded',
21 plugins: [
22 ApolloServerPluginDrainHttpServer({ httpServer }),
23 ApolloServerPluginLandingPageLocalDefault({ embed: true }),
24 ],
25 });
26
27 await server.start();
28
29 // Mount Apollo middleware here.
30 server.applyMiddleware({ app });
31 await new Promise<void>(resolve => httpServer.listen({ port: 4000 }, resolve));
32 console.log(`🚀 Server ready at http://localhost:4000${server.graphqlPath}`);
33 return { server, app };
34}
Options
Name / Type |
Description |
---|---|
| The server to drain; required. |
| How long to wait before forcefully closing non-idle connections. Defaults to 10_000 (ten seconds). |