104 votes

comment fermer correctement le serveur node-express ?

J'ai besoin de fermer le serveur après avoir reçu un appel de la part de /auth/github/callback url. Avec l'habituel API HTTP fermeture du site le serveur supporte actuellement avec server.close([callback]) mais avec le serveur node-express, j'obtiens les résultats suivants TypeError: Object function app(req, res){ app.handle(req, res); } has no method 'close' erreur. Et je ne sais pas comment trouver des informations pour résoudre ce problème.
Comment dois-je fermer le serveur express ?

Notes de configuration de NodeJS :

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

Code d'application réel :

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/');

Aussi, j'ai trouvé nodejs express close mais je ne suis pas sûr de pouvoir l'utiliser avec le code que j'ai : var app = express(); .

135voto

Vladimir Kuznetsov Points 1503

app.listen() renvoie à http.Server . Vous devez invoquer close() sur cette instance et non sur app instance.

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/');

Vous pouvez inspecter les sources : /node_modules/express/lib/application.js

58voto

Michael Points 3132

Dans la version express v3, ils ont supprimé cette fonction.

Vous pouvez toujours réaliser la même chose en assignant le résultat de app.listen() et appliquer la fermeture sur celle-ci :

var server = app.listen(3000);
server.close((err) => {
  console.log('server closed')
  process.exit(err ? 1 : 0)
})

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

12voto

Neha Sharma Points 192

Si une erreur se produit dans votre application express, vous devez alors fermer le serveur et vous pouvez le faire comme ci-dessous.

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

Si une erreur se produit, notre application recevra un signal appelé SIGTERM . Vous pouvez lire plus sur SIGTERM ici - 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((err) => {
    console.log('Http server closed.');
    process.exit(err ? 1 : 0);
  });
});

4voto

Gajus Kuizinas Points 4713

J'ai répondu à une variante de la question "comment terminer un serveur HTTP" de nombreuses fois sur différents sites. node.js les canaux de soutien. Malheureusement, je n'ai pu recommander aucune des bibliothèques existantes, car elles sont manque de d'une manière ou d'une autre. Depuis, j'ai mis en place un paquet qui (je crois) gère tous les cas attendus de la terminaison gracieuse du serveur HTTP(S) d'express.js.

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

Le principal avantage de http-terminator c'est que :

  • il ne fait pas de "monkey-patch" de l'API Node.js
  • il détruit immédiatement tous les sockets sans requête HTTP attachée
  • il permet un délai d'attente gracieux pour les sockets avec des requêtes HTTP en cours.
  • il gère correctement les connexions HTTPS
  • il informe les connexions utilisant le mode "keep-alive" que le serveur se ferme en définissant un en-tête "connection : close".
  • il ne met pas fin au processus Node.js

1voto

Ali80 Points 146

En appelant server.close fait le travail

server.close((err) => {
  console.log('server closed')
  process.exit(err ? 1 : 0)
})

Il est également bon d'écouter les signaux du système (utilisateur) et de s'arrêter de manière élégante en fonction de ceux-ci, pour cela vous devez écouter les deux. SIGTERM y SIGINT

const port = process.env.PORT || 5000;
const server = app.listen(port);
console.log(`listening on port:${port}`);
for (let signal of ["SIGTERM", "SIGINT"])
    process.on(signal, () => {
        console.info(`${signal} signal received.`);
        console.log("Closing http server.");
        server.close((err) => {
            console.log("Http server closed.");
            process.exit(err ? 1 : 0);
        });
    });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X