我正试图根据父对象中的值有条件地验证嵌套对象。
const schema = Joi.object({
a: Joi.string(),
b: Joi.object({
c: Joi.when(Joi.ref('..a'), { is: 'foo', then: Joi.number().valid(1), otherwise: Joi.number().valid(2) }),
}),
});
const obj = {
a: 'foo',
b: {
c: 2,
},
};
在这个例子中,我想得到一个错误,c必须是1,但验证通过了。我试过有参考文献和没有参考文献,但我显然误解了Joi工作原理的一些基本内容。有什么帮助吗?
在Joi.ref()
调用中还需要一个.
。..
将上升到父树,然后是另一个点来表示属性。因此,对于您的情况,它将转到父..
,然后获得属性parent.a
使用Joi游乐场,这对我很有效:
Joi.object({
a: Joi.string(),
b: Joi.object({
c: Joi.when(Joi.ref('...a'), {
is: 'foo',
then: Joi.number().valid(1),
otherwise: Joi.number().valid(2)
})
})
})
如果您不需要Joi.ref
,...
仍然可以引用父母的兄弟姐妹,就像他们的答案中指出的大约14只羊一样。我最终做了这样的事情:
Joi.object({
a: Joi.string(),
b: Joi.object({
c: Joi.when('...a', {
is: 'foo',
then: Joi.number().valid(1),
otherwise: Joi.number().valid(2),
}),
}),
});