Custom (user-friendly) ValidatorError message Custom (user-friendly) ValidatorError message mongoose mongoose

Custom (user-friendly) ValidatorError message


I generally use a helper function for such things. Just mocked this one up to be a little more general than then ones I use. This guy will take all of the "default" validators (required, min, max, etc.) and make their messages a little prettier (according to the messages object below), and extract just the message that you passed in your validator for custom validations.

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

And it can be used like this (express router example):

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

Before:

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

After:

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

Edit: Snap, just realized this was a CoffeeScript question. Not being a CoffeeScript guy, I wouldn't really want to rewrite this in CS. You could always just require it as a js file into your CS?


If you need get the first error message, see the following example:

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

Regards, Nicholls