Условная схема валидатора Joi - PullRequest
2 голосов
/ 22 января 2020

Мне нужно создать динамическую c схему для проверки моего запроса API в node js с использованием Joi validator в зависимости от ключа в запросе. Скажем, нижеприведенный шаблон - мои действительные запросы.

Я использую hapi/joi версию 16.1.8

Комбинация 1

{ type: 1, firstname: 'user first name', lastname: 'user last name'}

Комбинация 2

{ type: 2 , salary: 1000, pension: 200}

Комбинация 3

{ type: 3 , credit: 550, debit: 100}

Как видите, клавиши объектов различаются в зависимости от значения type. Как это можно сделать правильно?

Мы можем справиться с двумя условиями, используя Joi.alternatives вроде

const schema = Joi.alternatives().conditional(Joi.object({ type: 1 }).unknown(), {
    then: Joi.object({
        type: Joi.string(),
        firstname: Joi.string(),
        lastname: Joi.string()
    }),
    otherwise: Joi.object({
        type: Joi.number(),
        salary: Joi.any(),
        pension: Joi.any()
    })
});

Но как это можно сделать для 3 условий?

Ответы [ 2 ]

3 голосов
/ 23 января 2020

Я добился того же, немного по-другому. Публикация того же здесь, так как это может быть полезно для кого-то в будущем.

const schema = Joi.object({
    type: Joi.number().required().valid(1, 2, 3),
    firstname: Joi.alternatives().conditional('type', { is: 1, then: Joi.string().required() }),
    lastname: Joi.alternatives().conditional('type', { is: 1, then: Joi.string().required() }),
    salary: Joi.alternatives().conditional('type', { is: 2, then: Joi.number().required() }),
    pension: Joi.alternatives().conditional('type', { is: 2, then: Joi.number().required() }),
    credit: Joi.alternatives().conditional('type', { is: 3, then: Joi.number().required() }),
    debit: Joi.alternatives().conditional('type', { is: 3, then: Joi.number().required() }),
}))

Это работало отлично, как и ожидалось.

Когда значение типа 1, объект должен иметь только type, firstname и lastname

Когда значение типа 2, объект должен иметь только type, salary и pension

Когда значение типа is 3 объект должен иметь только type, credit и debit

Любая другая комбинация будет выброшена как ошибка со слоя промежуточного программного обеспечения валидатора joi. Также любое другое значение типа, кроме 1, 2 и 3, будет выдавать ошибку.

2 голосов
/ 22 января 2020

В документации похоже, что switch является действительным ключом для использования вместе с alternatives.conditional. Не могли бы вы попробовать следующее?

const schema = Joi.alternatives().conditional(Joi.object({
  type: 1
}).unknown(), {
  switch: [{
    is: 1,

    then: Joi.object({
      type: Joi.string(),
      firstname: Joi.string(),
      lastname: Joi.string(),
    }),
  }, {
    is: 2,

    then: Joi.object({
      type: Joi.number(),
      salary: Joi.any(),
      pension: Joi.any(),
    }),
  }, {
    // ...
  }],
});

EDIT :

Не удалось найти нигде примера использования ключевого слова switch. .

Но нашел другой способ добиться этого в hapijs / joi github

const schema = Joi.object({
     a: Joi.number().required(),
     b: Joi.alternatives()
             .conditional('a', [
                 { is: 0, then: Joi.valid(1) },
                 { is: 1, then: Joi.valid(2) },
                 { is: 2, then: Joi.valid(3), otherwise: Joi.valid(4) }
    ])
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...