web-dev-qa-db-fra.com

Gestion des erreurs avec Mongoose

Je suis un débutant absolu en NodeJS et je veux créer un simple REST-Webservice avec Express et Mongoose.

Quelle est la meilleure pratique pour gérer les erreurs de mangouste en un seul endroit central?

Lorsqu'une erreur de base de données se produit, je veux renvoyer une page d'erreur Http-500 avec un message d'erreur:

if(error) {
  res.writeHead(500, {'Content-Type': 'application/json'});
  res.write('{error: "' + error + '"}');
  res.end();
}

Dans l'ancien tutoriel http://blog-next-stage.learnboost.com/mongoose/ J'ai lu à propos d'un écouteur d'erreur global:

Mongoose.addListener('error',function(errObj,scope_of_error));

Mais cela ne semble pas fonctionner et je ne trouve rien dans la documentation officielle de Mongoose sur cet écouteur. Ai-je vérifié les erreurs après chaque demande Mongo?

27
Sonson123

Si vous utilisez Express, les erreurs sont généralement gérées soit directement dans votre itinéraire, soit dans une API construite au-dessus de mangouste, transmettant l'erreur à next.

app.get('/tickets', function (req, res, next) {
  PlaneTickets.find({}, function (err, tickets) {
    if (err) return next(err);
    // or if no tickets are found maybe
    if (0 === tickets.length) return next(new NotFoundError));
    ...
  })
})

Le NotFoundError pourrait être reniflé dans votre middleware du gestionnaire d'erreurs pour fournir une messagerie personnalisée.

Une certaine abstraction est possible mais vous aurez toujours besoin d'accéder à la méthode next afin de transmettre l'erreur le long de la chaîne de routage.

PlaneTickets.search(term, next, function (tickets) {
  // i don't like this b/c it hides whats going on and changes the (err, result) callback convention of node
})

Quant à la gestion centralisée des erreurs de mangouste, il n'y a pas vraiment un seul endroit pour les gérer tous. Les erreurs peuvent être gérées à plusieurs niveaux:

connection des erreurs sont émises sur le connection que vos modèles utilisent, donc

mongoose.connect(..);
mongoose.connection.on('error', handler);

// or if using separate connections
var conn = mongoose.createConnection(..);
conn.on('error', handler);

Pour les requêtes/mises à jour/suppressions typiques, l'erreur est transmise à votre rappel.

PlaneTickets.find({..}, function (err, tickets) {
  if (err) ...

Si vous ne passez pas de rappel, l'erreur est émise sur le modèle si vous l'écoutez:

PlaneTickets.on('error', handler); // note the loss of access to the `next` method from the request!
ticket.save(); // no callback passed

Si vous ne passez pas de rappel et n'écoutez pas les erreurs au niveau model, elles seront émises sur les modèles connection.

La clé à retenir ici est que vous voulez accéder à next d'une manière ou d'une autre pour transmettre l'erreur.

43
aaronheckmann