Пользовательское (удобное) сообщение ValidatorError

Я действительно новичок в mongoose, поэтому мне было интересно, есть ли способ установить 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, но все же хотите использовать функцию проверки мангуста.

Ответ 1

Обычно я использую вспомогательную функцию для таких вещей. Просто издевался над этим, чтобы быть немного более общим, чем те, которые я использую. Этот парень возьмет все валидаторы "по умолчанию" (обязательно, мин, макс и т.д.) И сделает их сообщения немного красивее (в соответствии с объектом 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?

Ответ 2

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

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

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