Схема для дополнительных условий в Джой - PullRequest
3 голосов
/ 22 мая 2019

Предположим, у меня есть объект типа:

{
  a : 1,
  b : 2,
  c : 3,
  d : 4
}

По крайней мере, 1 из пары из [a,b], [a,c], [d] должна пройти проверку (иметь правильные значения).

Предположим, что все значения числа .

Как мне создать схему Joi для него.

Ответы [ 2 ]

2 голосов
/ 23 мая 2019

Вы можете использовать Joi.alternatives () и создать схему Joi следующим образом:

Joi.alternatives().try(
    Joi.object({
        a: Joi.number().required(),
        b: Joi.number().required(),
        c: Joi.number(),
        d: Joi.number()
    }),
    Joi.object({
        a: Joi.number().required(),
        b: Joi.number(),
        c: Joi.number().required(),
        d: Joi.number()
    }),
    Joi.object({
        a: Joi.number(),
        b: Joi.number(),
        c: Joi.number(),
        d: Joi.number().required()
    }),
)

Существует другая альтернатива, которая использует .requiredKeys () и упрощает код выше:

const JoiObjectKeys = {
    a: Joi.number(),
    b: Joi.number(),
    c: Joi.number(),
    d: Joi.number()
}

Joi.alternatives().try(
    Joi.object(JoiObjectKeys).requiredKeys('a', 'b'),
    Joi.object(JoiObjectKeys).requiredKeys('a', 'c'),
    Joi.object(JoiObjectKeys).requiredKeys('d'),
);

С этой схемой вы получите следующие результаты:

{ a: 1 } > fails
{ b: 1 } > fails
{ c: 1 } > fails
{ a: 1, b: 1 } > passes
{ a: 1: c: 1 } > passes
{ d: 1 } > passes
{ d: 1, a: 1 } > passes
1 голос
/ 03 июля 2019

Будьте осторожны с использованием Joi.number().Он также будет считать '3' действительным - фактически не превращая его в число 3, если вы используете Joi.assert.Чтобы избежать этого, вам, вероятно, следует добавить модификатор .strict().

См. https://medium.com/east-pole/surprised-by-joi-35a3558eda30

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