基于根键值的 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 键值 truefalse,我想更改 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)
};