【问题标题】:Joi array Object validation based on root key value基于根键值的Joi数组对象验证
【发布时间】:2019-01-20 18:31:12
【问题描述】:

我有一个复杂的场景,我想使用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中的根对象控制数组中对象的验证定义

【问题讨论】:

    标签: javascript node.js joi


    【解决方案1】:

    将基于父键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)
    };
    

    【讨论】:

      【解决方案2】:

      在我看来,您可以按照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() 仅用于此类用例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-05
        • 1970-01-01
        • 2018-01-13
        • 1970-01-01
        • 2017-06-04
        • 2021-10-10
        • 2016-10-11
        • 2020-03-14
        相关资源
        最近更新 更多