Generalmente uso una función auxiliar para tales cosas. Solo me burlé de este para ser un poco más general que los que uso. Este tipo tomará todos los validadores "predeterminados" (requerido, mínimo, máximo, etc.) y hará que sus mensajes sean un poco más bonitos (de acuerdo con el objeto messages
a continuación), y extraerá solo el mensaje que pasó en su validador para personalizar validaciones.
function errorHelper(err, cb) {
//If it isn't a mongoose-validation error, just throw it.
if (err.name !== 'ValidationError') return cb(err);
var messages = {
'required': "%s is required.",
'min': "%s below minimum.",
'max': "%s above maximum.",
'enum': "%s not an allowed value."
};
//A validationerror can contain more than one error.
var errors = [];
//Loop over the errors object of the Validation Error
Object.keys(err.errors).forEach(function (field) {
var eObj = err.errors[field];
//If we don't have a message for `type`, just push the error through
if (!messages.hasOwnProperty(eObj.type)) errors.push(eObj.type);
//Otherwise, use util.format to format the message, and passing the path
else errors.push(require('util').format(messages[eObj.type], eObj.path));
});
return cb(errors);
}
Y puede ser utilizado como esto (expresar ejemplo router):
function (req, res, next) {
//generate `user` here
user.save(function (err) {
//If we have an error, call the helper, return, and pass it `next`
//to pass the "user-friendly" errors to
if (err) return errorHelper(err, next);
}
}
Antes:
{ message: 'Validation failed',
name: 'ValidationError',
errors:
{ username:
{ message: 'Validator "required" failed for path username',
name: 'ValidatorError',
path: 'username',
type: 'required' },
state:
{ message: 'Validator "enum" failed for path state',
name: 'ValidatorError',
path: 'state',
type: 'enum' },
email:
{ message: 'Validator "custom validator here" failed for path email',
name: 'ValidatorError',
path: 'email',
type: 'custom validator here' },
age:
{ message: 'Validator "min" failed for path age',
name: 'ValidatorError',
path: 'age',
type: 'min' } } }
Después:
[ 'username is required.',
'state not an allowed value.',
'custom validator here',
'age below minimum.' ]
Editar: Snap, acaba de darse cuenta de que esta era una pregunta de CoffeeScript. Al no ser un tipo de CoffeeScript, realmente no me gustaría volver a escribir esto en CS. ¿Siempre podría simplemente requerirlo como un archivo js
en su CS?
También ha Express-validador que funciona bien. – chovy