我有一个复杂的场景,我想使用Joi
进行验证
这里是示例Joi对象架构
const itemSchema = Joi.object({
product_id: Joi.string().required(),
quantity: Joi.number().required().min(0)
});
let objSchema = {
items: Joi.array().items(itemSchema).required().min(1),
item_return_flag: Joi.string().optional().valid(true, false)
};
根据Opon item_return_flag
的键值true
或false
,我想更改items.quantity
的最小值要求。当true
时,数量将为0,否则为1。
无论如何,根据Joi
中的根对象来控制数组中对象验证的定义
答案 0 :(得分:1)
在我看来,您可以遵循API docs进行如下操作:
let objSchema = {
items: Joi.array().items(Joi.object({
product_id: Joi.string().required(),
quantity: Joi.alternatives().when('item_return_flag', {
is: true, then: Joi.number().required().min(0),
otherwise: Joi.number().required().min(1)
})
})).required().min(1),
item_return_flag: Joi.string().optional().valid(true, false)
};
我不是100%地确定这是正确的结构,但是很接近。 Joi.alternatives()
仅用于此类用例。
答案 1 :(得分:0)
将基于父键item_return_flag
切换模式的示例代码。阵列的模式需要使用Joi.altertnatives()
let itemArr = Joi.object({
product_id: Joi.string().required(),
quantity: Joi.number().required().min(0)
});
let itemArr2 = Joi.object({
product_id: Joi.string().required(),
quantity: Joi.number().required().min(1)
});
let itemSchema = Joi.alternatives()
.when('item_return_flag', { is: true, then: Joi.array().items(itemArr).required().min(1), otherwise: Joi.array().items(itemArr2).required().min(1)}) ;
let objSchema = {
items: itemSchema,
item_return_flag: Joi.string().optional().valid(true, false)
};