¿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();.

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


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


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.');
  });
});

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

gracias por la respuesta, pero esta pregunta tiene 7 años
Vladimir Starkov

6
Sigue siendo una pregunta válida.
Gajus
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.