web-dev-qa-db-fra.com

Comment puis-je arrêter par programmation une instance d'ExpressJS pour le tester?

J'essaie de comprendre comment arrêter une instance d'Express. Fondamentalement, je veux l'inverse de l'appel .listen(port) - comment obtenir un serveur Express pour arrêter l'écoute, libérer le port et arrêter proprement?

Je sais que cela semble être une requête étrange, alors voici le contexte; il y a peut-être une autre façon d'aborder cela et j'y pense mal. J'essaie de configurer un cadre de test pour mon application socket.io/nodejs. C'est une application d'une seule page, donc dans mes scripts de test (j'utilise Mocha , mais cela n'a pas vraiment d'importance), je veux pouvoir démarrer le serveur, exécuter des tests sur lui, puis arrêtez le serveur. Je peux contourner cela en supposant que le serveur est allumé avant le début du test ou en demandant à l'un des tests de démarrer le serveur et en supposant que chaque test suivant est en place, mais c'est vraiment compliqué. Je préférerais de beaucoup que chaque fichier de test démarre une instance de serveur avec les paramètres appropriés, puis ferme cette instance lorsque les tests sont terminés. Cela signifie qu'il n'y a pas de dépendances étranges à l'exécution du test et que tout est propre. Cela signifie également que je peux faire des tests de démarrage/arrêt.

Alors, des conseils sur la façon de procéder? J'ai pensé à déclencher manuellement des exceptions pour la supprimer, mais cela semble compliqué. J'ai fouillé dans les documents Express et la source, mais je n'arrive pas à trouver de méthode qui arrêterait le serveur. Il peut également y avoir quelque chose dans socket.io pour cela, mais comme le serveur de socket est juste attaché au serveur Express, je pense que cela doit se produire au niveau de la couche express.

88
drewww

Les choses ont changé parce que le serveur express n'hérite plus du serveur http du noeud. Heureusement, app.listen renvoie l'instance de serveur.

var server = app.listen(3000);

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

Utilisez app.close(). Exemple complet:

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

Appelez app.close() à l'intérieur du rappel lorsque les tests sont terminés. Mais rappelez-vous que le processus est toujours en cours (bien qu'il n'écoute plus).

Si après cela, vous devez mettre fin au processus, puis appelez process.exit(0).

Liens:

app.close: http://nodejs.org/docs/latest/api/http.html#server.close (il en va de même pour)

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

15
Srijan Choudhary

Vous pouvez facilement le faire en écrivant un script bash pour démarrer le serveur, exécuter les tests et arrêter le serveur. Cela a l'avantage de vous permettre d'alias à ce script pour exécuter tous vos tests rapidement et facilement.

J'utilise de tels scripts pour l'ensemble de mon processus de déploiement continu. Vous devriez regarder Flux de travail Dead Simple Git de Jon Rohan pour un aperçu de cela.

0
Josh Smith