Joi 在验证时嵌套

Joi nested when validation

我正在尝试根据父项中的值有条件地验证嵌套对象。

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() 通话中还需要一个 ... 将上升到父树,然后另一个点表示 属性。因此,对于您的情况,它将转到父级 .. 然后获得 a 属性 parent.a

使用 Joi playground 这对我有用:

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)})
    })
})