我正在为我的api设置验证,如果客户端希望收到的通知设置为sms,则需要要求提供电话号码。该通知在验证模式中设置。我这里有以下代码可以更好地说明这一点,请注意.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() })
})
}
}
答案 0 :(得分:0)
那又怎么样:
phone_number: body.notification_type === 'sms' ? Joi.string().required() : Joi.string()
?
答案 1 :(得分:0)
我认为,如果通知类型数组不包含 sms 和 required (如果包含),则您希望电话号码为可选,您可以定义如下内容:
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:{
}
}