基于根键值的 Joi 数组对象验证
Joi array Object validation based on root key value
我有一个复杂的场景,我想使用 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)
};
取决于 item_return_flag
键值 true
或 false
,我想更改 items.quantity
最小值要求。当true
时,数量为0,否则为1。
有没有办法,根据Joi
中的根对象,控制数组中对象的验证定义
在我看来,您可以按照 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()
正是为此类用例提供的。
将根据父键 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)
};
我有一个复杂的场景,我想使用 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)
};
取决于 item_return_flag
键值 true
或 false
,我想更改 items.quantity
最小值要求。当true
时,数量为0,否则为1。
有没有办法,根据Joi
在我看来,您可以按照 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()
正是为此类用例提供的。
将根据父键 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)
};