尝试如下设置嵌套模式。如果要在存在aa.a时存在bb.c,我希望能够拒绝该架构。
我尝试过不如xor
{
Joi.object().keys({
aa: Joi.object().keys({
a: Joi.string(),
b: Joi.string()
}).unknown(true).with("a", "b"),
bb: Joi.object().keys({
c: Joi.string()
}).unknown(true)
}).xor( "aa.a" , ["bb.c"])
}
对于以下对象,xor失败,并出现ValidationError:“值”必须包含[aa.a,bb.c]中的至少一个,但提供的值中存在aa.a。
{
"aa": {
"a": "fg",
"b": "fg"
},
"bb": {
"c": "l"
}
}
如果我尝试
.without( "aa.a" , ["bb.c"])
然后该模式通过,尽管在我看来,如果bb.c与aa.a一起出现,它不应通过,否则会失败。
是因为这两个东西可能嵌套在其他对象中吗?
我们不能指定像这样的深层链接吗?
预先感谢
答案 0 :(得分:0)
您可以使用Joi.when()
并创建如下所示的模式:
Joi.object({
aa: Joi.object().keys({
a: Joi.string(),
b: Joi.string()
}).unknown(true).with('a', 'b'),
bb: Joi.object().keys({
c: Joi.string()
}).unknown(true)
.when('aa.a', {
is: Joi.exist(),
then: Joi.object({ c: Joi.forbidden() })
})
});
基本上,这是如果存在 aa.a ,则不允许 bb.c ,并且该架构将无法通过验证。使用这种模式,您的示例将按预期失败。