MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Umgang mit Mongoose-Validierungsfehlern – wo und wie?

An diesem Punkt scheint es logisch, sich darauf einzulassen, wie Mongoose mit Fehlern umgeht.

Sie möchten nicht, dass Ihre Modelle Fehlermeldungen verarbeiten. Die Präsentationsschicht (Controller?) sollte sich auf den type stützen um zu entscheiden, welche die beste benutzerfreundliche Nachricht ist, die angezeigt werden soll (i18n berücksichtigt).

Es gibt auch den Fall, in dem die Validierung durch die Verwendung einer Middleware erfolgen kann. In diesem Fall ist die Fehlermeldung, die Ihrem Controller angezeigt wird, diejenige, die Sie an next() übergeben Rückruf.

Für den Fall von Middleware sollten Sie also, obwohl nicht dokumentiert, direkt die Fehlerkonstruktoren von Mongoose verwenden, um eine konsistente Validierungs-API für Ihre Modelle beizubehalten:

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();
});

Auf diese Weise wird Ihnen eine konsistente Validierungsfehlerbehandlung garantiert, auch wenn der Validierungsfehler von einer Middleware stammt.

Um Fehlermeldungen korrekt Typen zuzuordnen, würde ich eine enum erstellen die als statische Karte für alle möglichen Typen fungieren würde:

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

    }
  });
});