Bonnes pratiques Node.js
Lancer l'application avec Forever
Même si vous catchez les erreurs comme indiqué ci-dessus, il se peut que votre application atteigne un état qui la fait arrêter de fonctionner. Vous pouvez lancer votre application avec Forever qui va s'occuper de relancer l'application si elle s'arrête. De plus, vous pourrez fermer votre console sans pour autant que l'application s'arrête de fonctionner.Installer Forever :
sudo npm install forever --global
Pour lancer une application : forever start server.js
Pour voir les processus lancés :
forever list
Pour stopper une application :
forever stop 6587
(6587 est l'identifiant du processus donné par forever list
)Pour lancer une application qui se relance toute seule même quand on lui demande de s'arrêter (avec un process.exit() par exemple) :
forever start --spinSleepTime 1000 server.js
Catcher les erreurs pour éviter que l'application s'arrête
Attention, certains sont tentés de catcher toutes les erreurs de l'application sans l'arrêter comme ceci :// Catcher les exceptions non attendues pour éviter de tuer l'application
process.on('uncaughtException', function(error) {
console.log("Une erreur qui aurait pu arrêter l'application a été capturée : " + error.stack);
});
Ce n'est surtout pas une bonne idée ! Si l'application a émi une uncaughtException
, c'est pour une bonne raison. Si vous catchez cette uncaughtException
et que vous laissez le code restant s'exécuter, l'application risque d'être dans un état incohérent. La meilleure solution est de laisser l'application s'arrêter et de la faire relancer par un agent extérieur comme expliqué ci-dessus avec Forever.Sources : https://stackoverflow.com/questions/4213351/make-node-js-not-exit-on-error/13049037#13049037
Tester une erreur fatale
Quand je développe mes applications, afin de tester leurs fonctionnement en cas d'errer fatale, j'utilise cette route :// Simuler une erreur fatale qui arrête l'application
app.all('/dev/fatal', function(req, res) {
const EventEmitter = require('events');
const ee = new EventEmitter();
setImmediate(() => {
// This will crash the process because no 'error' event
// handler has been added.
ee.emit('error', new Error('This will crash'));
});
res.end("ok");
});
// Simuler l'arrêt de l'application
app.all('/exit', function(req, res) {
process.exit(1);
res.end("ok");
});
Source : https://nodejs.org/api/errors.html#errors_error_propagation_and_interception