¿Cómo cerrar correctamente el servidor node-express?

84

Necesito cerrar el servidor después de recibir la devolución de llamada de la /auth/github/callback URL. Con el servidor de cierre HTTP API habitual, actualmente se admite la server.close([callback]) función API, pero con el servidor node-express obtengo un TypeError: Object function app(req, res){ app.handle(req, res); } has no method 'close' error. Y no sé cómo encontrar información para resolver este problema.
¿Cómo debo cerrar el servidor express?

Notas de configuración de NodeJS:

$ node --version
v0.8.17
$ npm --version
1.2.0
$ npm view express version
3.0.6

Código de aplicación real:

var app = express();

// configure Express
app.configure(function() {
    // … configuration
});

app.get(
    '/auth/github/callback',
    passport.authenticate('github', { failureRedirect: '/login' }),
    function(req, res) {
        res.redirect('/');

        setTimeout(function () {
            app.close();
            // TypeError: Object function app(req, res){ app.handle(req, res); } has no method 'close'
        }, 3000)
    }
);

app.listen('http://localhost:5000/');

Además, he encontrado 'nodejs expresan cerca ...' pero yo no estoy seguro si lo puedo usar con el código que tengo: var app = express();.

Vladimir Starkov
fuente

Respuestas:

114

app.listen()devuelve http.Server. Debe invocar close()en esa instancia y no en una appinstancia.

Ex.

app.get(
    '/auth/github/callback',
    passport.authenticate('github', { failureRedirect: '/login' }),
    function(req, res) {
        res.redirect('/');

        setTimeout(function () {
            server.close();
            // ^^^^^^^^^^^
        }, 3000)
    }
);

var server = app.listen('http://localhost:5000/');

Puede inspeccionar las fuentes: /node_modules/express/lib/application.js

Vladimir Kuznetsov
fuente
4
Extraño, no se cierra si accedo a alguna ruta.
Uday Hiwarale
1
@Uday, yo también experimenté esto. Descubrí que mi navegador tenía abierta una conexión persistente HTTP1.1, así que cuando presioné F5, parecía que el servidor no se cerraba. Si prueba con un navegador diferente, verá que el socket del servidor no se está ejecutando.
Rick Velde
Ese fue mi error, estaba llamando de cerca en applugar de server. Salvó mi día. Muchas gracias 👍
Edison Spencer
48

En express v3 eliminaron esta función.

Aún puede lograr lo mismo asignando el resultado de la app.listen()función y aplicándolo cerca:

var server = app.listen(3000);
server.close()

https://github.com/visionmedia/express/issues/1366

Miguel
fuente
Use algo como github.com/gajus/http-terminator para garantizar la terminación del servidor en caso de que haya conexiones persistentes o solicitudes que no produzcan una respuesta.
Gajus
breve y simple
krupesh Anadkat
4

Si ocurre algún error en su aplicación express, entonces debe cerrar el servidor y puede hacerlo como se muestra a continuación:

var app = express();
var server = app.listen(process.env.PORT || 5000)

Si ocurre algún error, nuestra aplicación obtendrá una señal llamada SIGTERM

Puede leer más sobre la señal del nodo aquí-

https://www.gnu.org/software/libc/manual/html_node/Termination-Signals.html

process.on('SIGTERM', () => {
  console.info('SIGTERM signal received.');
  console.log('Closing http server.');
  server.close(() => {
    console.log('Http server closed.');
  });
});
Neha Sharma
fuente
lo siento, no es relevante. La pregunta es sobre el apagado manual del servidor y no sobre el manejo de errores
Vladimir Starkov
1

He respondido una variación de "cómo terminar un servidor HTTP" muchas veces en diferentes canales de soporte. Desafortunadamente, no pude recomendar ninguna de las bibliotecas existentes porque faltan de una manera u otra. Desde entonces, armé un paquete que (creo) está manejando todos los casos que se esperan de la terminación elegante del servidor HTTP (S) express.js.

https://github.com/gajus/http-terminator

El principal beneficio de http-terminator es que:

  • no aplica un parche a la API Node.js
  • inmediatamente destruye todos los sockets sin una solicitud HTTP adjunta
  • permite un tiempo de espera elegante para los sockets con solicitudes HTTP en curso
  • maneja correctamente las conexiones HTTPS
  • informa a las conexiones mediante Keep-Alive que el servidor se está cerrando estableciendo una conexión: cerrar encabezado
  • no termina el proceso de Node.js
Gajus
fuente
gracias por la respuesta, pero esta pregunta tiene 7 años
Vladimir Starkov
6
Sigue siendo una pregunta válida.
Gajus