Op dit moment lijkt het logisch om in te zien hoe mangoest omgaat met fouten.
U wilt niet dat uw modellen foutmeldingen afhandelen. De presentatielaag (controllers?) moet vertrouwen op het type
om te beslissen welke het beste gebruiksvriendelijke bericht is om weer te geven (in overweging genomen i18n).
Er is ook een geval waarin validatie kan plaatsvinden door middel van middleware. In dit geval is de foutmelding die aan uw controller verschijnt, wat u ook doorgeeft aan de next()
terugbellen.
Dus in het geval van middleware, hoewel niet gedocumenteerd, moet u, om een consistente validatie-API voor uw modellen te behouden, rechtstreeks Mongoose's Error-constructors gebruiken:
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();
});
Op die manier bent u verzekerd van een consistente afhandeling van validatiefouten, zelfs als de validatiefout afkomstig is van een middleware.
Om foutmeldingen goed aan typen te koppelen, zou ik een enum maken die zou fungeren als een statische kaart voor alle mogelijke typen:
// 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);
}
});
});