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