Джой, как объединить / добавить / добавить подсхемы зависит от конкретных входных данных - PullRequest
0 голосов
/ 05 февраля 2019

Я хочу сделать проверку ввода пользователя в Node.js REST api.

У меня есть такая схема, например:

let schema = Joi.object().keys({
    client: {
      type: Joi.string().valid(["private", "business"]).required().error(JoiCustomErrors)
    },
 });

Теперь, если пользователь заполняет форму введите как private , я хочу добавить a к схеме, поэтому она будет выглядеть примерно так:

let schema = Joi.object().keys({
    client: {
      type: Joi.string().valid(["private", "business"]).required().error(JoiCustomErrors),
      a: Joi.string().required().error(JoiCustomErrors)
    },
  });

Если пользовательзаполняет business в поле type , которое я хочу добавить b вместо a (некоторые варианты для примера).

Я пытался:

let b = Joi.string().required().error(JoiCustomErrors);

schema.client.append({b: b}); // 1
schema.client.append(b); // 2
schema.client.b = b; // 3

Но ничего не работает. Я получаю неопределенную ошибку: TypeError: Невозможно прочитать свойство 'append' из неопределенного

1 Ответ

0 голосов
/ 06 февраля 2019

Хитрость здесь в том, чтобы определить оба правила для a и b в одной и той же схеме и добавить условные требования относительно того, требуются они или нет.

Обратите внимание на следующее:

Joi.object().keys({
    client: Joi.object().keys({
        type: Joi.string().valid([ 'private', 'business' ]).required(),
        a: Joi.string().when('type', { is: 'private', then: Joi.required() }),
        b: Joi.string().when('type', { is: 'business', then: Joi.required() })
    }).nand('a', 'b')
});

Эта схема требует client.type, поскольку она у вас уже есть.a и b были определены как необязательные строки, но они используют функцию Джой .when() для создания условного требования на основе значения type.

Еслиtype - это 'private', a требуется;если это 'business', b требуется.

Я также добавил модификатор .nand() к объекту client, который запретит a и bсуществовать в одно и то же время.

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