问题描述
我正在尝试基于带有 JOI 架构的上下文选项进行相关验证。
let context = {
"User.HasChildren": false,}
let schema = Joi.object({
"User.HasChildren": Joi.boolean(),"User.Children": Joi.when("$User.HasChildren",{
is: true,then: Joi.number().min(0).required(),otherwise: Joi.any().forbidden()
}),"User.ChildsYoungestAge": Joi.when("$User.HasChildren",then: Joi.when("$User.Children",{
is: Joi.number().min(0),then: Joi.number().required(),otherwise: Joi.any().forbidden()
}),otherwise: Joi.any().forbidden()
})
});
schema.validate({
"User.HasChildren": true,"User.Children": 4,"User.ChildsYoungestAge": 4
},{ context });
基本上是键名中的 .
导致了失败。如果我去掉 .
,我会得到预期的结果,但我无法控制密钥名称,因为它来自 API 响应对象。
我曾尝试更改 options
中的分隔符,但没有成功,我如何告诉 JOI .
是它们引用/键的一部分?
解决方法
经过额外的分析后,我意识到我在正确的轨道上,但没有正确定义分隔符。基本上我尝试在验证函数中设置它,但它需要单独定义到一个引用。
let context = {
"User.HasChildren": false,}
let schema = Joi.object({
"User.HasChildren": Joi.boolean(),"User.Children": Joi.when(Joi.ref("$User.HasChildren",{ separator: false }),{
is: true,then: Joi.number().min(0).required(),otherwise: Joi.any().forbidden()
}),"User.ChildsYoungestAge": Joi.ref("$User.HasChildren",then: Joi.when(Joi.ref("$User.Children",{
is: Joi.number().min(0),then: Joi.number().required(),otherwise: Joi.any().forbidden()
}),otherwise: Joi.any().forbidden()
})
});
schema.validate({
"User.HasChildren": true,"User.Children": 4,"User.ChildsYoungestAge": 4
},{ context });