sql >> Base de Datos >  >> NoSQL >> MongoDB

Manejo de errores de validación de Mongoose:¿dónde y cómo?

En este punto, parece lógico aceptar cómo mongoose maneja los errores.

No querrá que sus modelos manejen mensajes de error. La capa de presentación (¿controladores?) debe basarse en el type para decidir cuál es el mejor mensaje fácil de usar para mostrar (considerando i18n).

También existe el caso en el que la validación puede ocurrir mediante el uso de un middleware. En este caso, el mensaje de error que aparecerá en su controlador es lo que pase al next() devolución de llamada.

Entonces, para el caso del middleware, aunque no está documentado, para mantener una API de validación consistente en todos sus modelos, debe usar directamente los constructores de errores 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 esa manera, se le garantiza un manejo de errores de validación consistente, incluso si el error de validación se origina en un middleware.

Para hacer coincidir correctamente los mensajes de error con los tipos, crearía un enum que actuaría como un mapa estático para todos los tipos posibles:

// 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);

    }
  });
});