我有一个看起来像这样的对象:
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
对象动态实现此目的?
为此,您可以使用 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
}
)
);