Как запросить объект на основе значения массива с помощью проверки Joi - PullRequest
0 голосов
/ 20 апреля 2019

Я настраиваю валидацию для моего API, и мне нужно, чтобы номер телефона присутствовал, если уведомление, которое клиент хочет получить, установлено на смс.Уведомление устанавливается в схеме проверки.У меня есть следующий код, который проиллюстрирует это лучше, обратите внимание на раздел .required().when().Это делает поле номера телефона обязательным каждый раз, независимо от того, что содержит массив notification_type.

{
    body: {
        notification_type: Joi.array().unique().items(Joi.string().lowercase().valid(['sms', 'email')).min(1).max(3).optional(),
        customer: Joi.object().keys({
            first_name: Joi.string().required(),
            last_name: Joi.string().required(),
            email_address: Joi.string().email().required(),
            phone_number: Joi.string(), // make this required if notification_type contains 'sms'
            meta_data: Joi.object().optional()
        }).required().when('notification_type', {
            is: Joi.array().items(Joi.string().valid('sms')),
            then: Joi.object({ phone_number: Joi.required() })
        })
    }
}

Ответы [ 2 ]

0 голосов
/ 22 апреля 2019

Я думаю, вы хотите, чтобы номер телефона был необязательный , если массив типов уведомлений не включает смс и требуется , если это так, вы можете определитьчто-то вроде этого:

const schema = Joi.object({
    notification_type: Joi.array().items(
        Joi.string().valid('email', 'sms')
    ),
    customer: Joi.object({
        phone_number: Joi.string(),
    })
}).when(Joi.object({
    notification_type: Joi.array().items(
        Joi.string().valid('sms').required(),
        Joi.string().valid('email').optional()
    )
}).unknown(), {
    then: Joi.object({
        customer: Joi.object({
            phone_number: Joi.string().required()
        }).required()
    }),
    otherwise: Joi.object({
        customer: Joi.object({
            phone_number: Joi.optional()
        })
    })
});

Итак, следующий объект будет принят:

{
   notification_type:[
      'sms',
      'email'
   ],
   customer:{
      phone_number:'111-222-333'
   }
}

, а это не будет:

{
   notification_type:[
      'sms'
   ],
   customer:{

   }
}
0 голосов
/ 20 апреля 2019

А как же:

phone_number: body.notification_type === 'sms' ? Joi.string().required() : Joi.string()

?

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