Настраиваемое (удобное для пользователя) сообщение ValidatorError - PullRequest
11 голосов
/ 24 января 2012

Я действительно новичок в мангусте, поэтому мне было интересно, есть ли способ установить custom error message вместо значения по умолчанию, например Validator "required" failed for path password.

Я бы хотел установить что-то вроде Password is required.что более удобно для пользователя.

Я написал несколько пользовательских валидаторов и установил свойство type с этим удобным сообщением об ошибке, но я не уверен, что type является правильным заполнителем для сообщения об ошибке.также нет способа установить пользовательское сообщение для предопределенных валидаторов, таких как min, max, required, enum...

. Одно из решений - каждый раз проверять type свойство выдаваемой ошибки и вручную назначать сообщение об ошибке, но думаю, что это работа валидатора:

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

Это, очевидно, не идеальное решение.

Я рассмотрел express-form и node-validator , но все еще хочу использовать проверку Mongooseособенность.

Ответы [ 2 ]

16 голосов
/ 03 марта 2012

Я обычно использую вспомогательную функцию для таких вещей.Просто издевались над этим, чтобы быть немного более общим, чем те, которые я использую.Этот парень возьмет все валидаторы «по умолчанию» (обязательные, минимальные, максимальные и т. Д.) И сделает их сообщения немного красивее (в соответствии с объектом messages ниже) и извлечет только те сообщения, которые вы передали в свой валидатор.для пользовательских проверок.

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

И его можно использовать следующим образом (пример экспресс-маршрутизатора):

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

До:

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

После:

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

Редактировать : Snap, только что понял, что это был вопрос CoffeeScript.Не будучи парнем CoffeeScript, я бы не хотел переписывать это в CS.Вы всегда можете просто потребовать это как js файл в вашу CS?

0 голосов
/ 07 октября 2015

Если вам нужно получить первое сообщение об ошибке, см. Следующий пример:

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

С уважением, Николс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...