我正在nodeJs中编写一个更新端点。如果选中某些标志,我想确保不允许使用其他字段。
all_restaurant: Joi.boolean().required(),
merchant_id: Joi.when('all_restaurant',{'is':false,
then: Joi.string().required(), otherwise:Joi.disallow()})
如果all_restaurant为true,那么当用户尝试包含任何merchant_id时,我需要抛出一个错误,但它仍然允许我更新。我试着在字段后面和顶级中使用strict((,但什么都不起作用。有什么办法做到这一点吗?
您可以使用Join.forbden而不是Join.disallow:
const schema = Joi.object({
all_restaurant: Joi.boolean().required(),
merchant_id: Joi.string().when('all_restaurant', {
is: false,
then: Joi.required(),
otherwise: Joi.forbidden()
})
})
顾名思义,禁止将钥匙标记为禁止。
这是@shubham verma提出的一个变体(根据上面的答案提出(。
假设all_resturant
是一个具有有效字符串的数组:'A'
、'B'
或'C'
:
all_resturant: Joi.array().items(Joi.string().valid('A', 'B', 'C'))
只有当all_resturant[0]等于"A"时,我们才能使merchant_id为必需?
当与.结合使用时,我们仍然可以使用.订购:
Joi.object({
all_resturant: Joi.array().items(Joi.string().valid('A', 'B', 'C')),
merchant_id: Joi.string()
}).when(Joi.object({ all_resturant: Joi.array().ordered(Joi.string().valid('A')).items(Joi.string()) }).unknown(), {
then: Joi.object({
merchant_id: Joi.required()
})
})
Joi.array().ordered(Joi.string().valid('A')).items(Joi.string()
(意味着数组必须具有作为"A"
的第一个项和作为一个字符串的一个或多个后续项。
以下是一些案例:
{ all_resturant: ["A", "B", "A", "C"] }
//merchant_id需要
{ all_resturant: ["C", "B", "A", "C"] }
//通过
{ all_resturant: ["C"] }
//通过
{ all_resturant: ["A"] }
//merchant_id需要
{ all_resturant: ["A"], merchant_id: '123' }
//通过