如何使用Joi验证基于数组的值要求对象

时间:2019-04-20 15:40:09

标签: node.js joi

我正在为我的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() })
        })
    }
}

2 个答案:

答案 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:{

   }
}