sql >> Database teknologi >  >> NoSQL >> MongoDB

Håndtering af Mongoose-valideringsfejl – hvor og hvordan?

På dette tidspunkt virker det logisk at gå ind for, hvordan mongoose håndterer fejl.

Du ønsker ikke, at dine modeller skal håndtere fejlmeddelelser. Præsentationslaget (controllere?) bør stole på type at beslutte, hvilken der er den bedste brugervenlige besked at vise (i18n overvejet).

Der er også tilfældet, hvor validering kan ske ved at bruge en middleware. I dette tilfælde er fejlmeddelelsen, der dukker op til din controller, uanset hvad du sender til next() tilbagekald.

Så i tilfælde af middleware, selvom det ikke er dokumenteret, for at bevare en konsistent validerings-API på tværs af dine modeller bør du direkte bruge Mongoose's Error constructors:

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

På den måde er du sikret en ensartet håndtering af valideringsfejl, selvom valideringsfejlen stammer fra en middleware.

For at matche fejlmeddelelser korrekt med typer ville jeg oprette en enum som ville fungere som et statisk kort for alle mulige typer:

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

    }
  });
});


  1. Forøgelse af hundredvis af tællere på én gang, redis eller mongodb?

  2. Absolut værdi med MongoDB aggregeringsramme

  3. Nybegynder i realtid - Node.JS + Redis eller RabbitMQ -> klient/server hvordan?

  4. En introduktion til Percona Server til MongoDB 4.2