joi: Пользовательские ошибки не возвращаются, для abortEarly установлено значение false

Я не могу заставить эту проверку joi возвращать все ошибки так же, как это происходит с ошибками по умолчанию.

Итак, здесь я устанавливаю отдельные пользовательские ошибки для каждого поля:

const schema = Joi.object().keys({
    a: Joi.string().error(new Error('must be string')), 
    b: Joi.number().error(new Error('must be number'))
});

Затем при проверке с abortEarly, установленным в false, он возвращает только первую ошибку, с которой столкнется.

Joi.validate({a: 1, b: false}, schema, {abortEarly: false})

Возвращаемая ошибка выглядит так:

{ error: [Error: must be string], value: { a: 1, b: false }}

когда он должен каким-то образом возвращать все ошибки.

Я неправильно использую abortEarly или нужно выполнить какой-то процесс для возврата всех пользовательских ошибок? Заранее спасибо за любой ответ.


person Phenelo    schedule 05.04.2017    source источник


Ответы (2)


Ну, кажется, я нашел ответ. Моя библиотека joi не обновлялась, поэтому я обновил ее до 10.4.1 с 10.2.x. Были некоторые функции, которые я видел в документации, которые не работали, когда я пробовал их в более старой версии, включая решение, которое я сделал.

Я пробовал использовать этот шаблон, и он работает:

const schema = Joi.object().keys({
    a: Joi.string().error(() => 'must be string'), 
    b: Joi.number().error(() => 'must be number')
});

Вот так:

{ [ValidationError: child "a" fails because [must be string]. child "b" fails because [must be number]]
  isJoi: true,
  name: 'ValidationError',
  details: 
   [ { message: '"a" must be a string',
       path: 'a',
       type: 'string.base',
       context: [Object] },
     { message: '"b" must be a number',
       path: 'b',
       type: 'number.base',
       context: [Object] } ],
  _object: { a: 1, b: false },
  annotate: [Function] }

Затем я просто проанализирую error.message, чтобы получить все сообщения об ошибках и обработать их.

'child "a" fails because [must be string]. child "b" fails because [must be number]'
person Phenelo    schedule 05.04.2017

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

username: Joi.string() // It has to be string
  .label("Username") // The label
  .error(new Error('It is whatever error')) // Custom general error

Вы также можете сделать это с помощью функции стрелки:

username: Joi.string() // It has to be string
  .label("Username") // The label
  .error(() => 'It is whatever error') // Custom general error

Но если есть некоторые параметры проверки и ошибки, у нас есть следующие решения:

password: Joi.string()  // It has to be string
  .min(8) // It has to have at least 8 characters
  .required() // It has to have a value
  .label("Password") // The label
  .error(errors => {
    return errors.map(err => { // Here we map the errors (ES6) discover within an array
       if (err.type === "string.min") { // Check the type of error e.g: 'string.min,any.empty,number.min,...'
         return { message: "The length of the parameter should be more than 8 characters" }; // Which message we want to display
       } else {
         return { message: "another validation error" };
       }
    });
  })

Есть еще одно решение с Switch Case :

password: Joi.string()  // It has to be string
  .min(8) // It has to have at least 8 characters
  .required() // It has to have a value
  .label("Password") // The label
  .error(errors => {
    return errors.map(err => { // Here we map the errors (ES6) discover within an array
     switch (err.type) {
       case "string.min":
          return { message: "The length of the parameter should be more than 8 characters" }; // Which message we want to display
       case "any.empty":
          return { message: "The parameter should have a value" };
     }
  });
})

Обратите внимание, что если одна из ошибок проверки не указывает, что у вас есть ошибка, что err.type не определен.

вы можете использовать err.context в сообщении для отображения label, limit, max , ... в динамическом виде:

message: `${err.context.label} must have at least ${err.context.limit} characters.`

ссылка: Документ Joi

person Hamed    schedule 10.11.2018