HapiJS / Joi允许字段为具有特定键的String或Object

时间:2018-05-24 11:15:54

标签: node.js joi

我尝试验证POST请求,其中title可以是字符串,也可以是对象,其中包含语言键和值。例如:

{
    title: 'Chicken',
    ...
}
//OR
{
    title: {
        en_US: 'Chicken',
        de_DE: 'Hähnchen'
    }
    ...
}

对于Joi,我试图像这样验证:

{
   title: Joi.any().when('title', {
        is: Joi.string(),
        then: Joi.string().required(),
        otherwise: Joi.object().keys({
            en_US: Joi.string().required(),
            lt_LT: Joi.string()
        }).required()
    }),
...
}

然而,当我尝试验证时,我收到错误AssertionError [ERR_ASSERTION]: Item cannot come after itself: title(title) 有没有办法将when用于相同的字段?

1 个答案:

答案 0 :(得分:2)

在这种情况下,请查看使用.alternatives()而不是.when()。当您的键的值依赖于同一对象中的另一个键的值时,最好使用.when()。在您的场景中,我们只需要担心一键。

使用.alternatives()的可能解决方案如下:

Joi.object().keys({
    title: Joi.alternatives(
        Joi.string(),
        Joi.object().keys({
            en_US: Joi.string().required(),
            lt_LT: Joi.string()
        })
    ).required()
})