J'ai juste fait un tas de recherches dans ce domaine (voir ici, ici, ici, et ici) et la réponse à votre question est que le Nœud ne vous permettra pas d'en écrire un gestionnaire d'erreur, qui va attraper chaque scénario d'erreur qui pourraient survenir dans votre système.
Certains cadres comme express vous permettra d'attraper certains types d'erreurs (quand une méthode asynchrone retourne un objet d'erreur), mais il existe d'autres conditions que vous ne pouvez pas attraper avec un gestionnaire d'erreur. C'est une limitation (à mon avis) de Nœud et, éventuellement, inhérente à la programmation asynchrone en général.
Par exemple, disons que vous avez les éléments suivants express gestionnaire:
app.get("/test", function(req, res, next) {
require("fs").readFile("/some/file", function(err, data) {
if(err)
next(err);
else
res.send("yay");
});
});
Disons que le fichier "certains de/fichier" n'existent pas réellement. Dans ce cas, fs.readFile retournera un message d'erreur comme premier argument de la méthode de rappel. Si vous cochez la case pour que et faire ensuite(err) lorsque cela se produit, la valeur par défaut express gestionnaire d'erreur va prendre le relais et faire ce que vous en faites, par exemple, de retour de 500 à l'utilisateur). C'est une manière élégante pour gérer une erreur. Bien sûr, si vous oubliez de l'appel suivant(err), il ne fonctionne pas.
Donc, c'est la condition d'erreur qu'un gestionnaire peut traiter avec, toutefois envisager un autre cas:
app.get("/test", function(req, res, next) {
require("fs").readFile("/some/file", function(err, data) {
if(err)
next(err);
else {
nullObject.someMethod(); //throws a null reference exception
res.send("yay");
}
});
});
Dans ce cas, il y a un bug si votre code qui vous permet d'appeler une méthode sur un objet null. Ici, une exception sera levée, il ne sera pas pris par le gestionnaire d'erreurs globales, et votre nœud de l'application va se terminer. Tous les clients requêtes en cours d'exécution sur ce service permettra d'obtenir soudainement déconnecté avec aucune explication. Pas très gracieux de gestion d'erreur de scénario.
Il n'existe actuellement pas de gestionnaire d'erreurs globales de la fonctionnalité dans le Nœud pour gérer ce cas. Vous ne pouvez pas mettre un géant try/catch autour de tous expresse de votre part des gestionnaires parce que le temps de votre asyn de rappel s'exécute, ceux try/captures sont plus étendue. C'est juste la nature de code asynchrone, il rompt le try/catch erreur de manipulation de paradigme.
Autant que je sache, votre seul recours est ici de mettre try/captures autour de la machine synchrone parties de votre code à l'intérieur de chacune de vos async rappels, quelque chose comme ceci:
app.get("/test", function(req, res, next) {
require("fs").readFile("/some/file", function(err, data) {
if(err) {
next(err);
}
else {
try {
nullObject.someMethod(); //throws a null reference exception
res.send("yay");
}
catch(e) {
res.send(500);
}
}
});
});
Qui va le faire pour quelque méchante code, en particulier une fois que vous commencer à entrer dans imbriqués les appels asynchrones.
Certaines personnes pensent que ce Nœud ne dans ces cas (qui est, mourir) est la bonne chose à faire parce que votre système est dans un état incohérent et vous n'avez pas d'autre option. Je suis en désaccord avec ce raisonnement, mais je ne rentrerai pas dans un débat philosophique à ce sujet. Le point est que, avec le Noeud, votre seule option est d'espérer que votre couverture de test est assez bon pour que cela n'arrive pas. Vous pouvez mettre quelque chose comme upstart ou supervisord en place pour redémarrer votre application quand elle descend, mais c'est tout simplement l'atténuation du problème, pas une solution.
Node.js est actuellement instable fonctionnalité appelée domaines qui semble aborder cette question, bien que je ne sais pas beaucoup sur elle.