【问题标题】:How to perform conditional check on nested JSON with JOI Validator如何使用 JOI Validator 对嵌套 JSON 执行条件检查
【发布时间】:2021-09-03 17:12:49
【问题描述】:

我有一个express API 并运行joi 验证器作为我的中间件。我正在努力弄清楚如何对我的嵌套 JSON 对象执行条件检查。

userSelectionYes 时,我基本上希望LocationDatarequired。如果userSelectionNo 并且发送了LocationData,那么它应该给出一个错误。 另一个条件是,如果UserSelectionYes 并且发送了LocatoinData,我希望根据需要将所有数据包含在LocationData 中。你会注意到,如果name 存在,我将namelatitudelongitude 设为必需。

下面是我的代码。问题是,即使将 userSelection 设置为 No,它仍然接受不应该发生的 LocationData

这是我在体内发送的内容: “父母”:{ "userSelection":"是的", “位置数据”:{ "name":"位置名称", "address":"位置地址", "纬度":"-20.200202", “经度”:“50.230230” } }

以下是 JOI 验证架构:

let requiredIfExist = {
    is: Joi.exist(),
    then: Joi.required(),
    otherwise: Joi.forbidden()
};
parent: Joi.object().required().keys({
        userSelection: Joi.string().valid("Yes", "No").required(),
        LocationData: Joi.object().keys({
            name: Joi.string().min(3).max(100).when("userSelection", {
                is: "Yes",
                then: Joi.required(),
            }).concat(Joi.string().when("userSelection", {
                is: "No",
                then: Joi.forbidden(),
            })),
            address: Joi.string().when("name", requiredIfExist),
            latitude: Joi.number().min(-90).max(90).when("name",requiredIfExist),
            longitude: Joi.number().min(-180).max(180).when("name", requiredIfExist)
        }).concat(Joi.object().when("userSelection", {
            is: "No",
            then: Joi.forbidden(),
        })),
    })

【问题讨论】:

    标签: node.js express validation joi


    【解决方案1】:

    你不需要到处都有条件。您可以将架构简化为

    const schema = Joi.object({
        parent: Joi.object().required().keys({
            userSelection: Joi.string().valid('Yes', 'No').required(),
            LocationData: Joi.object().keys({
                name: Joi.string().min(3).max(100).required(),
                address: Joi.string().required(),
                latitude: Joi.number().min(-90).max(90).required(),
                longitude: Joi.number().min(-180).max(180).required(),
            })
        }).when(Joi.ref('.'), {
            is: Joi.object().keys({
                userSelection: Joi.equal('Yes')
            }),
            then: Joi.object({
                LocationData: Joi.required()
            }),
            otherwise: Joi.object({
                LocationData: Joi.forbidden()
            })
        })
    });
    

    此架构检查:

    1. 如果userSelectionYes ----> 所有字段都需要LocationData
    2. 如果userSelectionNo ----> 不允许LocationData

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      • 1970-01-01
      • 1970-01-01
      • 2018-02-27
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多