Проверка Joi - обязательное поле во время выполнения

Я использую hapijs для написания микросервиса. У меня есть API, который принимает три параметра в теле запроса (метод POST)

  • ID пользователя
  • Фамилия
  • Дата рождения

Я планирую провести валидацию с помощью JOI. Подтверждение должно быть следующим

  1. UserID должен быть обязателен, если в запросе отсутствуют как фамилия, так и дата рождения.

  2. Если UserID отсутствует, необходимо указать как фамилию, так и дату рождения.

Я пытался добиться этого, следуя. Похоже, это не работает.

export const userRequestModel = Joi.object().keys({
    lastname: Joi.string().when('uid',
        {
            is: undefined,
            then: Joi.string().required()
        }),
    dob: Joi.string().when('uid',
        {
            is: undefined,
            then: Joi.string().required()
        }),
    uid: Joi.string().
        when('lastname',
        {
            is: undefined,
            then: Joi.string().required()
        }).
        concat(Joi.string().when('dob',
            {
                is: undefined,
                then: Joi.string().required()
            }))
});

Объединение не кажется синтаксически правильным. Он показывает приведенную ниже ошибку ввода

Аргумент типа 'AlternativesSchema' не может быть назначен параметру типа 'FunctionSchema'. Свойство 'arity' отсутствует в типе 'AlternativesSchema'.


person Keerthivasan    schedule 10.08.2017    source источник


Ответы (1)


По сути, эта схема создает циклическую зависимость.

Ошибка: элемент, добавленный в группу uid, создал ошибку зависимостей

... проблема, которую Джой не умеет изящно решать, особенно когда клавиш больше двух. Расширенное обсуждение можно найти здесь среди других мест.

Возможной альтернативой может быть что-то вроде:

Joi.alternatives().try(
    Joi.object().keys({
        lastname: Joi.string().min(1).required(),
        dob: Joi.string().min(1).required(),
        uid: Joi.string()
    }),
    Joi.object().keys({
        lastname: Joi.string(),
        dob: Joi.string(),
        uid: Joi.string().min(1).required()
    })
);

Что некрасиво и может развалиться, если схема станет более сложной.

person Ankh    schedule 10.08.2017
comment
Спасибо @Ankh за ответ. Я получил еще одно предложение от члена сообщества Joi WesTyler. Взгляните на github.com/hapijs/joi/issues/1271. Смотрится немного элегантнее. - person Keerthivasan; 11.08.2017
comment
Привет, @Keerthivasan, спасибо за обновление, я определенно кое-что узнал из этого! - person Ankh; 11.08.2017