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’ .listen(port) – comment puis-je 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; Peut-être y a-t-il une autre façon d’aborder cette question et j’y pense mal. J’essaie de configurer un framework de test pour mon application socket.io/nodejs. C’est une application à une seule page, donc dans mes scripts de test (j’utilise Mocha , mais peu importe), je veux pouvoir démarrer le serveur, exécuter des tests et fermer le serveur. Je peux contourner ce problème en supposant que le serveur est allumé avant le début du test ou que l’un des tests démarre le serveur et que tous les tests subséquents supposent que le test est terminé, mais c’est vraiment compliqué. Je préférerais de beaucoup que chaque fichier de test démarre une instance de serveur avec les parameters appropriés, puis ferme cette instance une fois les tests terminés. Cela signifie qu’il n’y a pas de dépendance étrange à l’exécution du test et que tout est propre. Cela signifie également que je peux faire des tests de démarrage / arrêt.

Donc, des conseils sur la façon de procéder? J’ai pensé à déclencher manuellement des exceptions pour le réduire, mais cela semble désordonné. J’ai fouillé dans Express docs et source, mais ne semble pas trouver une méthode qui va arrêter le serveur. Il pourrait é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 sur la couche express.

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

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

    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() dans le rappel lorsque les tests sont terminés. Mais rappelez-vous que le processus est toujours en cours d’exécution (bien qu’il ne soit plus à l’écoute).

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

    Liens:

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

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

    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’aliaser ce script pour exécuter tous vos tests rapidement et facilement.

    J’utilise ces scripts pour l’ensemble de mon processus de déploiement continu. Vous devriez regarder le stream de travail Dead Simple Git de Jon Rohan pour en savoir plus.