我正在尝试使用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 });