Access JOI ref where key includes dot



我正在尝试使用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", {
is: true,
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.是它们ref/key的一部分?

经过额外的分析,我意识到我是在正确的轨道上,但没有正确定义分隔符。基本上,我尝试在验证函数中设置它,但它需要单独定义为ref。

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", { separator: false }), {
is: true,
then: Joi.when(Joi.ref("$User.Children", { separator: false }), {
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 });

最新更新