it-swarm.com.de

Wie kann ich eine ExpressJS-Instanz programmgesteuert zum Testen herunterfahren?

Ich versuche herauszufinden, wie eine Express-Instanz heruntergefahren werden kann. Grundsätzlich möchte ich die Umkehrung des .listen(port) -Aufrufs - wie bringe ich einen Express-Server dazu, das Abhören zu stoppen, den Port freizugeben und sauber herunterzufahren?

Ich weiß, das scheint eine seltsame Frage zu sein, also hier ist der Kontext. Vielleicht gibt es einen anderen Weg, dies zu erreichen, und ich denke falsch darüber nach. Ich versuche, ein Testframework für meine socket.io/nodejs-App einzurichten. Es ist eine einseitige App, also möchte ich in meinen Testskripten (ich verwende Mocha , aber das spielt keine Rolle) den Server starten und Tests dagegen ausführen können. und dann den Server herunterfahren. Ich kann dies umgehen, indem ich annehme, dass der Server vor dem Test eingeschaltet ist oder dass einer der Tests den Server startet und jeder nachfolgende Test davon ausgeht, dass er aktiv ist, aber das ist wirklich chaotisch. Ich würde es vorziehen, wenn jede Testdatei eine Serverinstanz mit den entsprechenden Einstellungen startet und diese Instanz dann herunterfährt, wenn die Tests beendet sind. Das heißt, es gibt keine seltsamen Abhängigkeiten beim Ausführen des Tests und alles ist sauber. Dies bedeutet auch, dass ich Tests zum Starten/Herunterfahren durchführen kann.

Also, irgendwelche Ratschläge, wie man das macht? Ich habe darüber nachgedacht, manuell Ausnahmen auszulösen, um das Problem zu beheben, aber das scheint unsauber zu sein. Ich habe Express-Dokumente und -Quellen durchgearbeitet, kann aber anscheinend keine Methode finden, mit der der Server heruntergefahren werden kann. Möglicherweise ist auch etwas in socket.io enthalten, aber da der Socket-Server nur mit dem Express-Server verbunden ist, muss dies auf der Express-Ebene geschehen.

88
drewww

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

var server = app.listen(3000);

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

Verwenden Sie 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);

Rufen Sie app.close() im Rückruf auf, wenn die Tests beendet sind. Denken Sie jedoch daran, dass der Prozess noch ausgeführt wird (obwohl er nicht mehr zuhört).

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

Links:

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

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

15

Sie können dies auf einfache Weise tun, indem Sie ein Bash-Skript schreiben, um den Server zu starten, die Tests auszuführen und den Server anzuhalten. Dies hat den Vorteil, dass Sie einen Alias ​​für dieses Skript 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 Jon Rohans Dead Simple Git Workflow ansehen, um einen Einblick in diese Sache zu erhalten.

0
Josh Smith