Comment gérer les exceptions de code dans node.js?
Je suis allé à travers la documentation de l'Express, et la partie décrivant la gestion d'erreur est complètement opaque pour moi.
J'ai pensé que la app
ils font référence à une instance createServer()
, droit? Mais je n'ai aucune idée de comment l'arrêter node.js de souffler dans le processus lorsqu'une exception se produit lors du traitement de la demande.
Je n'ai pas besoin de quelque chose de compliqué, vraiment, je veux juste de retour d'un statut de 500, en plus d'une réponse vide, chaque fois qu'il y a une exception. Le nœud de processus ne doit pas mettre fin juste parce qu'il y a une exception non interceptée quelque part.
Est-il un exemple simple de comment faire?
var express = require('express');
var http = require('http');
var app = express.createServer();
app.get('/', function(req, res){
console.log("debug", "calling")
var options = {
host: 'www.google.com',
port: 80,
path: "/"
};
http.get(options, function(response) {
response.on("data", function(chunk) {
console.log("data: " + chunk);
chunk.call(); //no such method; throws here
});
}).on('error', function(e) {
console.log("error connecting" + e.message);
});
});
app.configure(function(){
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});
app.listen(3000);
accidents de la totalité de l'app, la production de sperme
mypath/tst.js:16
chunk.call(); //no such method; throws here
^ TypeError: Object ... has no method 'call'
at IncomingMessage.<anonymous> (/Library/WebServer/Documents/discovery/tst.js:16:18)
at IncomingMessage.emit (events.js:67:17)
at HTTPParser.onBody (http.js:115:23)
at Socket.ondata (http.js:1150:24)
at TCP.onread (net.js:374:27)
just because there was an uncaught exception somewhere.
Le processus de va mourir si il y a une exception non interceptée. Si vous ne voulez pas à s'arrêter lorsqu'une exception se produit, d'intercepter l'exception et de retour d'erreur 500.- Vous pourriez être intéressé par la non-voie express: stackoverflow.com/questions/4213351/...
- Excellent, merci beaucoup @Matt !
Vous devez vous connecter pour publier un commentaire.
Si vraiment vous voulez attraper toutes les exceptions et de fournir quelques manipulations autres que la sortie de la Node.js processus, vous avez besoin pour gérer du Nœud uncaughtException événement.
Si vous pensez cela, c'est un Nœud de chose, et pas un Express chose, parce que si vous jetez une exception de certains arbitraire morceau de code, il n'y a aucune garantie Expresse ne peut ou ne jamais la voir, ou être dans une position à l'emprisonner. (Pourquoi? Les Exceptions n'interagissent pas très bien avec les événements asynchrones pilotés par callbacky code qui est le Nœud de style. Exceptions le voyage jusqu'à la pile d'appel pour trouver un
catch()
bloc qui est dans le champ d'application au moment de l'exception est levée. SimyFunction
diffère un peu de travail pour une fonction de rappel qui s'exécute lorsqu'un événement se produit, puis retour à la boucle d'événements, puis lorsque que la fonction de rappel est appelée, elle est appelée directement à partir de la boucle principale, etmyFunction
n'est plus sur la pile d'appel; si cette fonction de rappel déclenche une exception, même simyFunction
a un bloc try/catch, il ne va pas attraper l'exception.)Ce que cela signifie dans la pratique, c'est que si vous jetez une exception et ne pas attraper vous-même et vous le faites dans une fonction qui a été appelé directement par l'Express, Express, vous pouvez intercepter l'exception et d'appeler le gestionnaire d'erreur que vous avez installé, en supposant que vous avez configuré un morceau de gestion des erreurs middleware comme
app.use(express.errorHandler())
. Mais si vous jetez la même exception dans une fonction qui est appelée en réponse à un événement asynchrone, Express ne serez pas en mesure de l'attraper. (La seule manière qu'il pourrait attraper c'est à l'écoute pour le mondial NœuduncaughtException
de l'événement, ce qui serait une mauvaise idée, d'abord parce que c'est mondial, et vous devrez peut-être utiliser pour d'autres choses, et le second parce Express vous n'avez aucune idée de ce que la demande a été associée avec l'exception.)Voici un exemple. - Je ajouter cet extrait de code de la route-code de gestion existant Express app:
Maintenant, si je visite
http://localhost:3000/fail/sync
dans mon navigateur, le navigateur décharges d'une pile d'appel (affichage de l'express.errorHandler en action). Si je visitehttp://localhost:3000/fail/async
dans mon navigateur, cependant, le navigateur se met en colère (Chrome montre une "Aucune donnée reçue: Erreur 324, net::ERR_EMPTY_RESPONSE: Le serveur a fermé la connexion sans envoyer de données de message"), parce que le Nœud processus a quitté, montrant une trace sur la sortie standard stdout dans le terminal où je l'invoque.uncaughtException
.Pour être en mesure d'intercepter les erreurs asynchrones-je utiliser de domaine. Avec Express, vous pouvez essayer ce code:
Ce code fera de votre erreur asynchrone être capturés et envoyés à votre gestionnaire d'erreur. Dans cet exemple, j'utilise l'express.errorHandler, mais il fonctionne avec n'importe quel gestionnaire.
Pour plus d'informations sur le domaine: http://nodejs.org/api/domain.html
domain
module est en attente de l'autodérision. Donc, je ne vous recommande pas de l'utiliser.Vous pouvez utiliser le gestionnaire d'erreurs par défaut qui expriment utilise, qui est en fait erreur de connexion gestionnaire.
Mise à jour
Pour votre code, vous avez besoin pour capturer l'erreur et le transmettre à l'exprimer comme cela
var express = require('express');
), mais malheureusement, quand je fais la même chose dans mon code, il se bloque toujours le processus. J'ai mis à jour la question avec des exemples de code.var errorhandler = require('errorhandler'); app.use(errorhandler());
.express 5.0.0-alpha.7 est sorti il y a 27 jours. Avec ce très spécifiques pré-version, vous pouvez maintenant enfin rejeter une promesse à l'intérieur d'un gestionnaire de requêtes et elle sera traitée correctement:
Par exemple:
Toutefois, seule l'utilisation de ce comme un secours. La bonne gestion des erreurs doivent encore se produire à l'intérieur de catch-phrases à l'intérieur de la demande des gestionnaires eux-mêmes avec le bon état d'erreur des codes.