D'autres réponses sont vraiment insensées, comme vous pouvez les lire dans les propres documents de Node à http://nodejs.org/docs/latest/api/process.html#process_event_uncaughtexception
Si quelqu'un utilise d'autres réponses énoncées, lisez Node Docs:
Notez qu'il uncaughtException
s'agit d'un mécanisme très grossier pour la gestion des exceptions et peut être supprimé à l'avenir
PM2
Tout d'abord, je recommande fortement l'installation PM2
pour Node.js
. PM2 est vraiment excellent pour gérer les plantages et surveiller les applications Node ainsi que pour l'équilibrage de charge. PM2 démarre immédiatement l'application Node chaque fois qu'elle se bloque, s'arrête pour une raison quelconque ou même lorsque le serveur redémarre. Ainsi, si un jour, même après avoir géré notre code, l'application tombe en panne, PM2 peut la redémarrer immédiatement. Pour plus d'informations, Installer et exécuter PM2
Revenons maintenant à notre solution pour empêcher l'application elle-même de planter.
Donc, après avoir parcouru, j'ai finalement trouvé ce que le document Node lui-même suggère:
Ne pas utiliser uncaughtException
, utiliser domains
avec à la cluster
place. Si vous utilisez uncaughtException
, redémarrez votre application après chaque exception non gérée!
DOMAIN avec cluster
En fait, nous envoyons une réponse d'erreur à la demande qui a déclenché l'erreur, tout en laissant les autres terminer dans leur temps normal et en arrêtant d'écouter les nouvelles demandes de ce worker.
De cette manière, l'utilisation du domaine va de pair avec le module de cluster, puisque le processus maître peut créer un fork d'un nouveau worker lorsqu'un worker rencontre une erreur. Voir le code ci-dessous pour comprendre ce que je veux dire
Grâce à l'utilisation Domain
et à la résilience de la séparation de notre programme en plusieurs processus de travail Cluster
, nous pouvons réagir de manière plus appropriée et gérer les erreurs avec une sécurité beaucoup plus grande.
var cluster = require('cluster');
var PORT = +process.env.PORT || 1337;
if(cluster.isMaster)
{
cluster.fork();
cluster.fork();
cluster.on('disconnect', function(worker)
{
console.error('disconnect!');
cluster.fork();
});
}
else
{
var domain = require('domain');
var server = require('http').createServer(function(req, res)
{
var d = domain.create();
d.on('error', function(er)
{
//something unexpected occurred
console.error('error', er.stack);
try
{
//make sure we close down within 30 seconds
var killtimer = setTimeout(function()
{
process.exit(1);
}, 30000);
// But don't keep the process open just for that!
killtimer.unref();
//stop taking new requests.
server.close();
//Let the master know we're dead. This will trigger a
//'disconnect' in the cluster master, and then it will fork
//a new worker.
cluster.worker.disconnect();
//send an error to the request that triggered the problem
res.statusCode = 500;
res.setHeader('content-type', 'text/plain');
res.end('Oops, there was a problem!\n');
}
catch (er2)
{
//oh well, not much we can do at this point.
console.error('Error sending 500!', er2.stack);
}
});
//Because req and res were created before this domain existed,
//we need to explicitly add them.
d.add(req);
d.add(res);
//Now run the handler function in the domain.
d.run(function()
{
//You'd put your fancy application logic here.
handleRequest(req, res);
});
});
server.listen(PORT);
}
Bien qu'il Domain
soit en attente de dépréciation et sera supprimé car le nouveau remplacement arrive comme indiqué dans la documentation de Node
Ce module est en attente de dépréciation. Une fois qu'une API de remplacement a été finalisée, ce module sera complètement obsolète. Les utilisateurs qui doivent absolument disposer des fonctionnalités fournies par les domaines peuvent s'y fier pour le moment, mais devraient s'attendre à devoir migrer vers une solution différente à l'avenir.
Mais jusqu'à ce que le nouveau remplacement ne soit pas introduit, Domain with Cluster est la seule bonne solution ce que suggère Node Documentation.
Pour une compréhension Domain
et une Cluster
lecture approfondies
https://nodejs.org/api/domain.html#domain_domain (Stability: 0 - Deprecated
)
https://nodejs.org/api/cluster.html
Merci à @Stanley Luo pour nous avoir partagé cette merveilleuse explication approfondie sur les clusters et les domaines
Cluster et domaines