嵌套的 Joi 验证在使用时不起作用

Nested Joi validations not working using when

我一直在尝试嵌套 where 验证,但到目前为止运气不好。这是我想要实现的目标:

1- 如果 mainType 是 COMMERCIAL,则为 contactMethod 定义所需的架构。 2- 如果 isHousing 为真,则为 contactMethod 定义所需的架构。 3- 如果 mainType 是 REAL_ESTATE 则不允许传递 contactMethod 对象

以下是我失败的尝试:

contactMethod: Joi.when('mainType', {
    is: 'COMMERCIAL',
    then: Joi.object()
        .keys({
            create: Joi.object({
                message: Joi.string().allow(''),
            }).required(),
        })
        .required()),
}).when('isHousing', {
    is: true,
    then: Joi.object()
        .keys({
            create: Joi.object({
                message: Joi.string().allow(''),
            }).required(),
        })
        .required(),
    otherwise: Joi.disallow(),
})

我也试过这个:

contactMethod: Joi.when('mainType', {
    switch: [
        {
            is: 'COMMERCIAL',
            then: Joi.object()
                .keys({
                    create: Joi.object({
                        message: Joi.string().allow(''),
                    }).required(),
                })
                .required(),
        },
        {
            is: 'REAL_ESTATE',
            then: Joi.when('isHousing', {
                is: true,
                then: Joi.object()
                    .keys({
                        create: Joi.object({
                            message: Joi.string().allow(''),
                        }).required(),
                    })
                    .required(),
            }),
            otherwise: Joi.disallow(),
        },
    ],    
})   

那么我做错了什么?

和第一关一样 - 使用.keys({})定义对象属性。

contactMethod: Joi.when('mainType', {
  is: 'COMMERCIAL',
  then: Joi.object()
    .keys({
      create: Joi.object() // You missing usage of Joi.object()
        .keys({ // should define object attribute here
          message: Joi.string().allow(''),
        })
        .required(),
    })
    .required(),
}).when('isHousing', {
  is: true,
  then: Joi.object()
    .keys({
      create: Joi.object() // the same :|
        .keys({
          message: Joi.string().allow(''),
        })
        .required(),
    })
    .required(),
  otherwise: Joi.disallow(),
});

好的,我是这样解决的:

contactMethod: Joi.when('mainType', {
        is: 'COMMERCIAL',
        then: Joi.object()
            .keys({
                create: Joi.object()
                    .keys({
                        message: Joi.string().allow(''),
                    })
                    .required(),
            })
            .required(),
        otherwise: Joi.when('isHousing', {
            is: true,
            then: Joi.object()
                .keys({
                    create: Joi.object()
                        .keys({
                            message: Joi.string().allow(''),
                        })
                        .required(),
                })
                .required(),
            otherwise: Joi.forbidden(),
        }),
    })

我的尝试没有包含上面@hoangdv 建议的键 ({}) + 我还需要将 disallow() 更改为禁止。

希望这对以后的人有所帮助。