MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Obsługa błędów walidacji Mongoose – gdzie i jak?

W tym momencie wydaje się logiczne, aby przekonać się, jak mangusta radzi sobie z błędami.

Nie chciałbyś, aby Twoje modele obsługiwały komunikaty o błędach. Warstwa prezentacji (kontrolery?) powinna opierać się na type zdecydować, która wiadomość jest najbardziej przyjazna dla użytkownika do wyświetlenia (rozważana przez i18n).

Istnieje również przypadek, w którym walidacja może nastąpić przy użyciu oprogramowania pośredniczącego. W takim przypadku komunikat o błędzie, który pojawi się w twoim kontrolerze, to wszystko, co przekażesz do next() oddzwonienie.

Tak więc w przypadku oprogramowania pośredniego, choć nieudokumentowanego, w celu zachowania spójnego interfejsu API walidacji we wszystkich modelach, należy bezpośrednio użyć konstruktorów Mongoose's Error:

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

W ten sposób masz gwarancję spójnej obsługi błędów walidacji, nawet jeśli błąd walidacji pochodzi z oprogramowania pośredniego.

Aby poprawnie dopasować komunikaty o błędach do typów, utworzyłbym enum która działałaby jako mapa statyczna dla wszystkich możliwych typów:

// 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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Który SchemaType w Mongoose jest najlepszy dla sygnatury czasowej?

  2. MongoDB:Aktualizacja poddokumentu

  3. Jak uciec @ w haśle w połączeniu pymongo?

  4. jak pogrupować w mongoDB i zwrócić wszystkie pola w wyniku

  5. Problemy z MongoDB PHP UTF-8