Joi 条件验证

问题描述 投票:0回答:1

我有一个看起来像这样的对象:

const preference = {
  INVENTORY: {
    id: true,
    part_name: true,
    part_number: true,
    is_available: false
  },
  ASSET: {
    name: true,
    type: true,
    make: false
  },
  DRIVERS: {
    driver_name: true,
    license_number: true,
    experience: false
  }
};

我有一个更新端点,它需要一个 JSON,其中应该始终有一个

preference_type
键,该键只能是
INVENTORY
ASSET
DRIVERS
。其余的键取决于提供的
preference_type
。 因此,例如,如果
preference_type
INVENTORY
,则适当的有效负载将是:

{
    "section": `INVENTORY`,
    "id": false,
    "part_name": false,
    "part_number": true,
    "is_available": true
}

如果出现

DRIVERS

{
    "section": "DRIVERS",
    "driver_name": true,
    "license_number": false,
    "experience": false
}

如果出现

ASSET

{
    "section": "ASSET",
    "name": false,
    "type": true,
    "make": false
}

如何使用

preference
对象动态实现此目的?

node.js hapi.js joi
1个回答
0
投票

为此,您可以使用 when,就像

if/else

参考此架构

const schema = Joi.object({
    section: Joi.string().valid('INVENTORY', 'DRIVERS', 'ASSET').required()
})
    .when(Joi.object({ section: Joi.valid('INVENTORY') }).unknown(), {
        then: Joi.object({
            part_name: Joi.bool().required(),
            part_number: Joi.bool().required(),
            is_available: Joi.bool().required()
        })
    })
    .when(Joi.object({ section: Joi.valid('DRIVERS') }).unknown(), {
        then: Joi.object({
            name: Joi.bool().required(),
            type: Joi.bool().required(),
            make: Joi.bool().required()
        })
    })
    .when(Joi.object({ section: Joi.valid('ASSET') }).unknown(), {
        then: Joi.object({
            driver_name: Joi.bool().required(),
            license_number: Joi.bool().required(),
            experience: Joi.bool().required()
        })
    });


// Test
console.log(
    schema.validate(
        {
            section: 'ASSET',
            driver_name: true,
            license_number: true,
            experience: false
        },
        {
            abortEarly: false
        }
    )
);
© www.soinside.com 2019 - 2024. All rights reserved.