MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Gérer les erreurs de validation de Mongoose – où et comment ?

À ce stade, il semble logique d'accepter la façon dont Mongoose gère les erreurs.

Vous ne voudriez pas que vos modèles traitent les messages d'erreur. La couche de présentation (contrôleurs ?) doit s'appuyer sur le type pour décider quel est le meilleur message convivial à afficher (i18n pris en compte).

Il y a aussi le cas où la validation peut se produire en utilisant un middleware. Dans ce cas, le message d'erreur qui apparaîtra à votre contrôleur est ce que vous transmettez au next() rappel.

Ainsi, pour le cas du middleware, bien que non documenté, afin de conserver une API de validation cohérente entre vos modèles, vous devez utiliser directement les constructeurs d'erreur de Mongoose :

var mongoose = require('mongoose');
var ValidationError = mongoose.Error.ValidationError;
var ValidatorError  = mongoose.Error.ValidatorError;

schema.pre('save', function (next) {
  if (/someregex/i.test(this.email)) {
    var error = new ValidationError(this);
    error.errors.email = new ValidatorError('email', 'Email is not valid', 'notvalid', this.email);
    return next(error);
  }

  next();
});

De cette façon, vous avez la garantie d'une gestion cohérente des erreurs de validation, même si l'erreur de validation provient d'un middleware.

Pour faire correspondre correctement les messages d'erreur aux types, je créerais un enum qui agirait comme une carte statique pour tous les types possibles :

// my controller.js

var ValidationErrors = {
  REQUIRED: 'required',
  NOTVALID: 'notvalid',
  /* ... */
};


app.post('/register', function(req, res){
  var user = new userModel.Model(req.body);

  user.save(function(err){
    if (err) {
      var errMessage = '';

      // go through all the errors...
      for (var errName in err.errors) {
        switch(err.errors[errName].type) {
          case ValidationErrors.REQUIRED:
            errMessage = i18n('Field is required');
            break;
          case ValidationErrors.NOTVALID:
            errMessage = i18n('Field is not valid');
            break;
        }
      }
      res.send(errMessage);

    }
  });
});