2015-04-18 1 views
1

Je veux développer la gestion des erreurs à un seul point dans mon application expressJS.
J'ai ajouté le code suivant dans la configuration de express.js:Traitement des erreurs dans ExpressJS

app.use(app.router); 
app.use(function (err, req, res, next) { 
    console.error('ExpressJS : error!!!'); 
}); 


Ainsi, toute erreur est survenue dans l'application ci-dessus alors fonction doit s'exécuter afin que je puisse gérer l'erreur de façon personnalisée.
Mais, au-dessus fonction ne reçoit pas exécuter javascript erreur ou le code suivant:

throw new Error('something broke!'); 

J'ai lu:
http://expressjs.com/guide/error-handling.html et
http://derickbailey.com/2014/09/06/proper-error-handling-in-expressjs-route-handlers/
Mais, encore je ne suis pas en mesure de faire la gestion des erreurs génériques dans mon application expressJS.
Quelqu'un peut-il expliquer comment je vais gérer une erreur d'application à un seul point?

+1

Si seulement il était aussi simple que cela. Une erreur peut se produire presque n'importe où, vous devez l'attraper là où elle se produit. Vous pouvez bien entendu utiliser une seule route pour répondre aux erreurs du serveur, mais vous ne pouvez pas saisir toutes les erreurs dans cette route. – adeneo

Répondre

5

Non par exprès, mais nodejs, vous pouvez essayer

process.on('uncaughtException', function(err) { 
    console.log(err); 
}); 

Parce que "jeter" est javascript, pas sous contrôle express.js.

Pour ces erreurs, comme le routage express, vous devriez pouvoir attraper avec app.error ou app.use (fonction (err .. comme autre conseillé, qui serait disponible req, res objet aussi.

app.error(function(err, req, res, next){ 
    //check error information and respond accordingly 
}); 

//newer versions 
app.use(function(err, req, res, next) { 

}); 
Si vous passez un paramètre

app.get('/api/resource',function(req, res, next) { 
    //some code, then err occurs 
    next(err); 
}) 

appelant next() déclenchera le prochain middleware/gestionnaire dans votre chaîne (comme:

+0

Est-il possible d'obtenir l'objet request et response dans le code ci-dessus? –

+0

pour autant que je sache. Non, throw est le code javacript, et c'est le code javascript. les deux s'exécutent dans nodejs, pas par exprès. ou essayez app.error – YOU

+0

Existe-t-il une solution de contournement pour l'objet de requête et de réponse dans le cas ci-dessus? –

0

en fait, vous avez besoin de mettre la gestion des erreurs à la fin du routeur,

app.use(function(err, req, res, next) { 
    console.error(err.stack); 
    res.status(500).send('Something broke!'); 
}); 

si vous avez l'enregistreur d'erreur, vous devez le mettre en face de la gestion des erreurs.

app.use(bodyParser()); 
app.use(methodOverride()); 
app.use(logErrors);   // log the error 
app.use(clientErrorHandler); // catch the client error , maybe part of the router 
app.use(errorHandler);   // catch the error occured in the whole router 

et vous pouvez définir plusieurs middleware de gestion des erreurs, chaque erreur de gestion d'erreur de niveau différent.

+0

J'ai utilisé le code ci-dessus mais cela ne fonctionne toujours pas. –

+0

ce genre d'erreur s'est produite dans votre express? – qianjiahao

+0

throw new Erreur ('Quelque chose s'est cassé!''); –

0

express, vous déclenchez la gestion des erreurs de la route en appelant next() avec un paramètre, comme suit. en next(err)), il ignore les gestionnaires suivants et déclenche le middleware de gestion des erreurs. Pour autant que je sache, si vous faites simplement une erreur, il ne sera pas détecté par express et vous risquez de planter votre instance de nœud.

Rappelez-vous que vous pouvez avoir autant de gestionnaires d'erreurs que vous avez besoin:

app.use(function (err, req, res, next) { 
    //do some processing... 
    //let's say you want more error middleware to trigger, then keep on calling next with a parameter 
    next(err); 
});