J'essaie de comprendre comment arrêter une instance d'Express. Fondamentalement, je veux l'inverse de l' .listen(port)
appel - comment faire pour qu'un serveur Express arrête d'écouter, libère le port et s'arrête proprement?
Je sais que cela semble être une question étrange, alors voici le contexte; peut-être y a-t-il 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 dessus, puis arrêter le serveur. Je peux contourner ce problème en supposant que soit le serveur est allumé avant le début du test, soit en demandant à l'un des tests de démarrer le serveur et de faire en sorte que chaque test suivant suppose qu'il est opérationnel, 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 arrête cette instance lorsque les tests sont terminés. Cela signifie qu'il n'y a pas de dépendances étranges pour exécuter le 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 les réduire, mais cela semble compliqué. J'ai fouillé dans la documentation et la source d'Express, mais je ne parviens pas à trouver une méthode qui arrêtera le serveur. Il peut également y avoir quelque chose dans socket.io pour cela, mais comme le serveur de socket est simplement connecté au serveur Express, je pense que cela doit se produire au niveau de la couche express.
server.close()
si vous appelez cela à partir d'un crochet.Utilisez
app.close()
. Exemple complet:Appel
app.close()
à l'intérieur du rappel lorsque les tests sont terminés. Mais rappelez-vous que le processus est toujours en cours d'exécution (bien qu'il n'écoute plus).Si après cela, vous devez terminer le processus, 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
la source
J'ai répondu à plusieurs reprises à une variante de "comment terminer un serveur HTTP" sur différents node.jscanaux de soutien. Malheureusement, je ne peux recommander aucune des bibliothèques existantes car elles font défaut d'une manière ou d'une autre. J'ai depuis mis en place un package qui (je crois) gère tous les cas attendus d'une terminaison de serveur HTTP gracieuse.
https://github.com/gajus/http-terminator
Le principal avantage de http-terminator est que:
Utilisation avec Express.js:
la source
la source
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 de créer un alias sur ce script pour exécuter tous vos tests rapidement et facilement.
J'utilise de tels scripts pour tout mon processus de déploiement continu. Vous devriez regarder Dead Simple Git Workflow de Jon Rohan pour avoir un aperçu de cela.
la source