138 votes

Comment puis-je arrêter par programmation une instance d'ExpressJS à des fins de test?

Je suis à essayer de comprendre comment arrêter une instance de l'Express. En fait, je cherche l'inverse de l' .listen(port) appelez - comment puis-je obtenir un Express server pour ARRÊTER l'écoute, libérer le port, et l'arrêt proprement?

Je sais que cela semble comme il pourrait être une étrange requête, voici donc le contexte; peut-être il ya une autre façon d'aborder cette et je suis en train de réfléchir de manière erronée. Je suis en train de l'installation d'un framework de test pour mon socket.io/nodejs app. C'est une page unique application, donc dans mes scripts de test (je suis en utilisant Moka, mais qui n'a pas vraiment d'importance) je veux être en mesure de démarrer le serveur, exécuter des tests contre elle, puis d'arrêter le serveur. Je peux contourner ce problème en supposant que le serveur est allumé avant le début du test, ou l'un des tests de démarrer le serveur et le fait que tous les test de supposer qu'il est, mais c'est vraiment salissant. Je préférerais de beaucoup avoir chaque fichier de test démarrer une instance de serveur avec les paramètres appropriés, puis fermer cette instance vers le bas lorsque les tests sont terminés. Cela signifie qu'il ya plus d'étranges dépendances à l'exécution du test et tout est propre. Cela signifie aussi que je peux faire de démarrage/arrêt de l'essai.

Donc, tous les conseils sur la façon de faire cela? J'ai pensé manuellement déclencher des exceptions à l'abattre, mais qui semble en désordre. J'ai creusé à travers Exprimer docs et de la source, mais n'arrive pas à trouver une méthode qui permettra d'arrêter le serveur. Il peut également y avoir quelque chose dans le support.io pour cela, mais depuis la socket serveur est simplement attaché à l'Express serveur, je pense que ce qui doit arriver à la couche.

211voto

Rich Apodaca Points 7327

Les choses ont changé car le serveur express n'hérite plus du serveur http du nœud. Heureusement, app.listen renvoie l'instance du serveur.

 var server = app.listen(3000);

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

20voto

Srijan Choudhary Points 186

Utiliser 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 de la fonction de rappel lorsque les tests sont terminés. Mais rappelez-vous que le processus est toujours en cours d'exécution(même si il ne les écoute pas plus).

Si après cela, vous devez terminer le processus, puis appelez process.exit(0).

Liens:

app.proche: http://nodejs.org/docs/latest/api/http.html#server.close (même chose s'applique pour l')

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

-2voto

Josh Smith Points 4420

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 présente l’avantage de vous permettre d’aliaser 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 jeter un coup d'œil sur le workflow Dead Simple Git de Jon Rohan .

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