基于根键值的Joi数组对象验证

时间:2018-08-14 00:43:35

标签: javascript node.js joi

我有一个复杂的场景,我想使用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的键值truefalse,我想更改items.quantity的最小值要求。当true时,数量将为0,否则为1。

无论如何,根据Joi中的根对象来控制数组中对象验证的定义

2 个答案:

答案 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)
};