[英]Joi - validate a property based on value of other property
我想根据image.offer
os.disk_size
。
如果image.offer
是windows
则os.disk_size>= 64
对于所有其他情况os.disk_size>=30
下面的示例数据
{
"resource": {
"vms": {
"v1": {
"os": {
"disk_size": 30
},
"image": {
"offer": "ubuntu"
},
},
"v2": {
"os": {
"disk_size": 50
},
"image": {
"offer": "CentOS"
}
},
"v3": {
"os": {
"disk_size": 64
},
"image": {
"offer": "windows"
}
}
}
}
}
样品验证:
我正在使用"joi": "^13.1.2"
const schemas = {
resource: {
vms: Joi.object({
image: Joi.object({
offer: Joi.string().required()
}).optional(),
os: Joi.object({
disk_size: Joi.number().required()
}).required(),
}),
}
};
您的架构没有考虑对象键v1
、 v2
和v3
。
要考虑这些键并遵循模式v + number
,您可以将Joi.pattern与正则表达式/v\d/
一起使用:
Joi.object().pattern(/v\d/, ...)
这意味着密钥应该以v
开头并以数字结尾。
Joi.object({
resource: Joi.object({
vms: Joi.object().pattern(
/v\d/,
Joi.object({
image: Joi.object({
offer: Joi.string().required(),
}).optional(),
os: Joi.object({
disk_size: Joi.when(Joi.ref("...image.offer"), {
is: "windows",
then: Joi.number().min(64),
otherwise: Joi.number().min(30),
}),
}).required(),
})
),
}),
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.