Wie schließe ich den Node-Express-Server richtig?

84

Ich muss den Server schließen, nachdem ich einen Rückruf von der /auth/github/callback URL erhalten habe. Mit der üblichen HTTP-API wird das Schließen des Servers derzeit mit der server.close([callback]) API-Funktion unterstützt, aber mit dem Node-Express-Server wird eine TypeError: Object function app(req, res){ app.handle(req, res); } has no method 'close' Fehlermeldung angezeigt. Und ich weiß nicht, wie ich Informationen finden kann, um dieses Problem zu lösen.
Wie soll ich den Express-Server schließen?

Hinweise zur NodeJS-Konfiguration:

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

Aktueller Anwendungscode:

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

Ich habe auch 'nodejs express close ...' gefunden , bin mir aber nicht sicher, ob ich es mit Code verwenden kann, den ich habe : var app = express();.

Vladimir Starkov
quelle

Antworten:

115

app.listen()kehrt zurück http.Server. Sie sollten close()diese Instanz und nicht die appInstanz aufrufen .

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

Sie können Quellen einsehen: /node_modules/express/lib/application.js

Vladimir Kuznetsov
quelle
4
Seltsamerweise schließt es nicht, wenn ich auf eine Route zugreife.
Uday Hiwarale
1
@Uday habe ich das auch erlebt. Ich fand heraus, dass in meinem Browser eine dauerhafte HTTP1.1-Verbindung geöffnet war. Als ich F5 drückte, sah es so aus, als würde der Server nicht geschlossen. Wenn Sie einen anderen Browser ausprobieren, wird der Server-Socket nicht ausgeführt.
Rick Velde
Das war mein Fehler, ich habe appstattdessen angerufen server. Hat meinen Tag gerettet. Vielen Dank 👍
Edison Spencer
48

In Express v3 haben sie diese Funktion entfernt.

Sie können dasselbe immer noch erreichen, indem Sie das Ergebnis der app.listen()Funktion zuweisen und es in der Nähe anwenden:

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

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

Michael
quelle
Verwenden Sie github.com/gajus/http-terminator , um die Beendigung des Servers sicherzustellen, falls dauerhafte Verbindungen oder Anforderungen bestehen, die keine Antwort liefern.
Gajus
kurz und einfach
krupesh Anadkat
4

Wenn in Ihrer Express-App ein Fehler auftritt, müssen Sie den Server schließen und können dies wie folgt tun:

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

Wenn ein Fehler auftritt, erhält unsere Anwendung ein Signal mit dem Namen SIGTERM

Weitere Informationen zum Knotensignal finden Sie hier.

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
quelle
Entschuldigung, es ist nicht relevant. Die Frage
Vladimir
1

Ich habe eine Variation von "Wie man einen HTTP-Server beendet" viele Male auf verschiedenen beantwortet Unterstützungskanäle. Leider konnte ich keine der vorhandenen Bibliotheken empfehlen, da sie auf die eine oder andere Weise fehlen . Ich habe seitdem ein Paket zusammengestellt, das (glaube ich) alle Fälle behandelt, die von einer ordnungsgemäßen Beendigung des HTTP (S) -Servers von express.j erwartet werden.

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

Der Hauptvorteil von http-terminator ist, dass:

  • Es gibt keine Node.js-API für Affen-Patches
  • Es werden sofort alle Sockets ohne angehängte HTTP-Anforderung zerstört
  • Es ermöglicht ein ordnungsgemäßes Timeout für Sockets mit laufenden HTTP-Anforderungen
  • HTTPS-Verbindungen werden ordnungsgemäß verarbeitet
  • Es informiert Verbindungen mit Keep-Alive darüber, dass der Server heruntergefahren wird, indem eine Verbindung hergestellt wird: Header schließen
  • Der Node.js-Prozess wird nicht beendet
Gajus
quelle
Vielen Dank für die Antwort, aber diese Frage ist 7 Jahre alt
Vladimir
7
Es bleibt eine gültige Frage.
Gajus