2012-01-24 15 views
11

Sono davvero nuovo di mangusta, quindi mi chiedevo se c'è un modo per impostare custom error message invece di uno predefinito come Validator "required" failed for path password.Messaggio convalida personalizzato (user-friendly)

Mi piacerebbe impostare qualcosa come Password is required. che è più user-friendly.

Ho scritto alcuni validatori personalizzati e impostato la proprietà type con questo messaggio di errore di facile utilizzo, ma non sono sicuro che type sia il segnaposto giusto per il messaggio di errore. Inoltre non v'è alcun modo per impostare un messaggio personalizzato su validatori predefiniti come min, max, required, enum...

Una soluzione è quella di controllare ogni volta type proprietà di errore generato e assegnare manualmente il messaggio di errore, ma credo che sia il lavoro di convalida:

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

Questo ovviamente non è la soluzione ideale.

Ho dato un'occhiata a express-form e node-validator ma voglio comunque utilizzare la funzione di convalida di mangusta.

+0

C'è anche espresso validatore che funziona bene. – chovy

risposta

16

Generalmente uso una funzione di supporto per tali cose. Ho appena preso in giro questo per essere un po 'più generale di quelli che uso. Questo tizio prenderà tutti i validatori "predefiniti" (obbligatori, min, max, ecc.) E renderà i loro messaggi un po 'più carini (secondo l'oggetto messages di seguito) ed estrarrà solo il messaggio che hai passato nel tuo validatore per l'abitudine convalide.

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

E può essere utilizzato in questo modo (esprimere esempio 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); 
    } 
} 

Prima:

{ 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' } } } 

Dopo:

[ 'username is required.', 
    'state not an allowed value.', 
    'custom validator here', 
    'age below minimum.' ] 

Modifica: Snap, ho appena realizzato che si trattava di una domanda di CoffeeScript. Non essendo un tipo CoffeeScript, non vorrei davvero riscriverlo in CS. Potresti sempre richiederlo come file js nel tuo CS?

+0

Grazie amico :). Ho già biforcato il progetto di mangusta e penso di aver risolto tutto questo. Invio [richiesta pull] (https://github.com/LearnBoost/mongoose/pull/753) ai ragazzi di mangusta. Post scriptum Questo non è affatto CoffeScript ... Volevo solo scrivere qualche pseudo-codice, ma il moderatore ha aggiunto il tag CoffeScript :) – ManInTheBox

+0

Awesome thanks man – Unitech

0

Se avete bisogno di ottenere il primo messaggio di errore, vedere l'esempio seguente:

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

saluti, Nicholls

Problemi correlati