Frage Wie kann ich eine ExpressJS-Instanz programmatisch zum Testen herunterfahren?


Ich versuche herauszufinden, wie ich eine Instanz von Express herunterfahren kann. Grundsätzlich möchte ich das Gegenteil von der .listen(port) Anruf - Wie bekomme ich einen Express-Server, der auf STOP hört, den Port freigibt und sauber herunterfährt?

Ich weiß, dass es scheint, als wäre es eine seltsame Frage, also hier ist der Kontext; Vielleicht gibt es einen anderen Weg, um das zu erreichen, und ich denke darüber falsch nach. Ich versuche ein Test-Framework für meine socket.io/nodejs App einzurichten. Es ist eine Einzelseiten-App, also in meinen Testskripten (die ich verwende Mokka, aber das ist nicht wirklich wichtig) Ich möchte in der Lage sein, den Server zu starten, Tests dagegen auszuführen und dann den Server herunterzufahren. Ich kann das umgehen, indem ich annahm, dass entweder der Server vor dem Start des Tests eingeschaltet wird oder dass einer der Tests den Server startet und dass bei jedem weiteren Test davon ausgegangen wird, dass es läuft, aber das ist wirklich chaotisch. Mir wäre es viel lieber, wenn jede Testdatei eine Serverinstanz mit den entsprechenden Einstellungen startet und diese dann nach Abschluss der Tests herunterfährt. Das bedeutet, dass es keine merkwürdigen Abhängigkeiten zum Ausführen des Tests gibt und alles sauber ist. Es bedeutet auch, dass ich Tests zum Starten / Herunterfahren durchführen kann.

Also, irgendwelche Ratschläge, wie man das macht? Ich habe über das manuelle Auslösen von Ausnahmen nachgedacht, um es herunterzubringen, aber das scheint chaotisch zu sein. Ich habe Express-Dokumente und Quellcode gegraben, kann aber keine Methode finden, die den Server herunterfahren würde. Möglicherweise gibt es auch etwas in socket.io, aber da der Socket-Server nur an den Express-Server angeschlossen ist, muss dies auf der Express-Ebene geschehen.


76
2017-12-28 17:11


Ursprung


Antworten:


Dinge haben sich geändert weil der Express-Server nicht mehr vom Knoten http-Server erbt. Glücklicherweise gibt app.listen die Serverinstanz zurück.

var server = app.listen(3000);

// listen for an event
var handler = function() {
  server.close();
};

110
2018-06-07 16:50



Benutzen app.close(). Vollständiges Beispiel:

var app = require('express').createServer();
app.get('/', function(req, res){
  res.send('hello world');
});
app.get('/quit', function(req,res) {
  res.send('closing..');
  app.close();
});
app.listen(3000);

Anruf app.close() innerhalb des Callbacks, wenn die Tests beendet sind. Aber denken Sie daran, dass der Prozess noch läuft (obwohl er nicht mehr zuhört).

Wenn Sie danach den Vorgang beenden müssen, rufen Sie an process.exit(0).

Links:

App.close: http://nodejs.org/docs/latest/api/http.html#server.close (Gleiches gilt für)

process.exit: http://nodejs.org/docs/latest/api/process.html#process.exit


12
2017-12-28 18:38



Sie können dies einfach tun, indem Sie ein Bash-Skript schreiben, um den Server zu starten, die Tests auszuführen und den Server zu stoppen. Dies hat den Vorteil, dass Sie mit diesem Skript einen Alias ​​erstellen können, um alle Ihre Tests schnell und einfach auszuführen.

Ich verwende solche Skripte für meinen gesamten kontinuierlichen Bereitstellungsprozess. Sie sollten sich ansehen Jon Rohans Dead Simple Git Workflow für einen Einblick darauf.


0
2017-12-28 17:28