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
restart your application after every unhandled exception!
Dans le cas où 2000 utilisateurs utilisent un serveur Web de nœud pour le streaming vidéo et 1 utilisateur a une exception, le redémarrage n'interrompra pas tous les autres utilisateurs?uncaughtException
et à utiliserDomain
à laCluster
place, donc si un utilisateur fait face à une exception, seul son thread est supprimé du cluster et en crée un nouveau pour lui. Et vous n'avez pas non plus besoin de redémarrer votre serveur Node. De l'autre côté, si vous l'utilisez,uncaughtException
vous devez redémarrer votre serveur à chaque fois que l'un de vos utilisateurs rencontre un problème. Alors, utilisez Domain with Cluster.domain
est complètement obsolète et supprimé?cluster
etworkers
: sitepoint.comJ'ai mis ce code juste sous mes instructions require et déclarations globales:
travaille pour moi. la seule chose que je n'aime pas à ce sujet, c'est que je ne reçois pas autant d'informations que si je laissais simplement la chose planter.
la source
forever
ou quelque chose.Comme mentionné ici, vous trouverez
error.stack
un message d'erreur plus complet tel que le numéro de ligne à l'origine de l'erreur:la source
Essayer
supervisor
Ou vous pouvez installer à la
forever
place.Tout cela va faire est de récupérer votre serveur lorsqu'il plante en le redémarrant.
forever
peut être utilisé dans le code pour récupérer gracieusement tout processus qui plante.Les
forever
documents contiennent des informations solides sur la gestion des sorties / erreurs par programme.la source
L'utilisation de try-catch peut résoudre les erreurs non interceptées, mais dans certaines situations complexes, cela ne fonctionnera pas correctement, comme la fonction de capture asynchrone. N'oubliez pas que dans Node, tout appel de fonction asynchrone peut contenir une opération de plantage d'application potentielle.
L'utilisation
uncaughtException
est une solution de contournement, mais elle est reconnue comme inefficace et sera probablement supprimée dans les futures versions de Node, alors ne comptez pas dessus.La solution idéale est d'utiliser le domaine: http://nodejs.org/api/domain.html
Pour vous assurer que votre application est opérationnelle même si votre serveur est en panne, procédez comme suit:
utilisez le cluster de nœuds pour créer plusieurs processus par cœur. Donc, si un processus meurt, un autre processus démarre automatiquement. Consultez: http://nodejs.org/api/cluster.html
utilisez domain pour intercepter l'opération asynchrone au lieu d'utiliser try-catch ou uncaught. Je ne dis pas qu'essayer ou non est une mauvaise pensée!
utilisez forever / supervisor pour surveiller vos services
ajoutez un démon pour exécuter votre application de nœud: http://upstart.ubuntu.com
J'espère que cela t'aides!
la source
Essayez le module de nœud pm2, il est de loin cohérent et a une excellente documentation. Gestionnaire de processus de production pour les applications Node.js avec un équilibreur de charge intégré. veuillez éviter uncaughtException pour ce problème. https://github.com/Unitech/pm2
la source
UncaughtException est "un mécanisme très grossier" (donc vrai) et les domaines sont désormais obsolètes. Cependant, nous avons encore besoin d'un mécanisme pour détecter les erreurs autour des domaines (logiques). La bibliothèque:
https://github.com/vacuumlabs/yacol
peut vous aider à le faire. Avec un peu d'écriture supplémentaire, vous pouvez avoir une belle sémantique de domaine tout autour de votre code!
la source
Fonctionne très bien sur restify:
la source