2012-01-24 14 views
11

Soy realmente nuevo en mangosta, así que me preguntaba si hay alguna manera de establecer custom error message en lugar de uno predeterminado como Validator "required" failed for path password.ValidatorError personalizado (fácil de usar) mensaje

Me gustaría establecer algo así como Password is required., que es más fácil de usar.

Escribí algunos validadores personalizados y configuré la propiedad type con este mensaje de error fácil de usar, pero no estoy seguro de que type es el marcador de posición correcto para el mensaje de error. También no hay manera de establecer un mensaje personalizado sobre los validadores predefinidos como min, max, required, enum...

Una solución es comprobar cada vez que type característica de error que se produce y asignar manualmente mensaje de error, pero creo que es el trabajo del validador:

save model 
    if error 
     check error type (eg. "required") 
     assign fancy error message (eg. "Password is required.") 

Este obviamente no es la solución ideal.

Miré express-form y node-validator pero todavía quiero usar la función de validación de mangosta.

+0

También ha Express-validador que funciona bien. – chovy

Respuesta

16

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?

+0

Gracias hombre :). Ya bifurqué el proyecto de mangosta y creo que resolvió esto. Envío [solicitud de extracción] (https://github.com/LearnBoost/mongoose/pull/753) para mangostar chicos. PD Esto no es CoffeScript en absoluto ... Solo quería escribir un pseudo código, pero el moderador agregó la etiqueta CoffeScript :) – ManInTheBox

+0

Awesome thanks man – Unitech

0

Si necesita obtener el primer mensaje de error, ver el siguiente ejemplo:

var firstError = err.errors[Object.keys(err.errors)[0]]; 
return res.status(500).send(firstError.message); 

Saludos, Nicholls

Cuestiones relacionadas