Vid det här laget verkar det logiskt att förstå hur mongoose hanterar fel.
Du vill inte att dina modeller ska hantera felmeddelanden. Presentationsskiktet (kontroller?) bör förlita sig på type
för att bestämma vilket som är det bästa användarvänliga meddelandet att visa (i18n övervägt).
Det finns också ett fall där validering kan ske genom att använda en middleware. I det här fallet är felmeddelandet som kommer upp till din kontrollenhet vad du än skickar till next()
återuppringning.
Så, för fallet med mellanprogram, även om det inte är dokumenterat, för att behålla ett konsekvent validerings-API över dina modeller bör du direkt använda Mongooses felkonstruktorer:
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å så sätt garanteras du en konsekvent hantering av valideringsfel även om valideringsfelet härrör från en mellanprogramvara.
För att korrekt matcha felmeddelanden med typer skulle jag skapa en uppräkning som skulle fungera som en statisk karta för alla möjliga 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);
}
});
});