Джой проверить массив объектов с условием когда - PullRequest
0 голосов
/ 31 января 2020

Прежде всего, извините за плохого Энгли sh.

Я не могу найти никаких документов по этому поводу.

ЧТО ХОЧУ ДЕЛАТЬ

const docs = {
  type: 'a', // ['a',' 'b', 'c'] is available.
  items: [
    {
      a: 123,
      b: 100 // => This value only available when type is 'a' or 'b'. otherwise, forbidden.
    }
  ]
};

МОЯ ДЖОЙСКАЯ СХЕМА (НЕ РАБОТАЕТ)

Joi.object({
  type: Joi.string().valid('a', 'b', 'c').required(),
  items: Joi.array()
    .items(
      Joi.object({
        a: Joi.number().required()
        b: Joi.number()
      })
    )
    .when('type', {
      is: Joi.string().valid('a', 'b'),
      then: Joi.array().items(Joi.object({ b: Joi.number().required() })),
      otherwise: Joi.array().items(Joi.object({ b: Joi.number().forbidden() }))
    })
})

Этот код работает неправильно. Когда типом является 'c', проверка передается успешно.

Как я могу это исправить?

1 Ответ

1 голос
/ 31 января 2020

Вы добавили .items() к items: Joi.array(), который переопределяет условие .when(), попробуйте использовать

Joi.object({
    type: Joi.string().valid('a', 'b', 'c').required(),
    items: Joi.array()
        .when('type', {
            is: Joi.string().valid('a', 'b'),
            then: Joi.array().items(Joi.object({
                a: Joi.number().required(),
                b: Joi.number().required()
            })),
            otherwise: Joi.array().items(Joi.object({
                a: Joi.number().required()
            }))
        })
})

пример

...