Joi 条件验证:基于“platform”验证“platformConfig.platformApiKey”时出错

Joi Conditional Validation: Error When Validating 'platformConfig.platformApiKey' Based on 'platform

提问人:Roland Rios 提问时间:10/19/2023 更新时间:10/19/2023 访问量:21

问:

我正在使用 joi 进行架构验证。

我需要验证以下数据

"body": { 
    "event": "someEvent",
    "frequency": "someFrequency",
    "ApiToken": "samsaraApiToken",
    "TelematicsTypes": "someTele",
    "platform": "Uber | DIDI | SinDelantal",
    "platformConfig": {
      "platformApiKey": "someApiKey"
      "platformUser": "someUser",
      "platformPassword": "somePass"
    }

我需要进行以下验证:

  1. 如果平台是 Uber 或 DIDI,则需要 platformApiKey,用户和密码是可选的
  2. 如果平台是 SinDelantal,则需要用户和密码,并且 platformApiKey 是可选的。

这是我的JOI文件

platform: joi.string().valid('Uber', 'DIDI', 'SinDelantal').required(),
      platformConfig: joi.object({

        platformApiKey: joi.alternatives().conditional('platform', {
          is: joi.valid('Uber', 'DIDI'),
          then: joi.string().required(),
        })
        .conditional('platform', {
          is: joi.not(joi.valid('Uber', 'DIDI')),
          then: joi.string().allow('').optional(),
        }),

        platformUser: joi.alternatives().conditional('platform', {
          is: 'SinDelantal',
          then: joi.string().required(),
        })
        .conditional('platform', {
          is: joi.not(joi.valid('')),
          then: joi.string().allow('').optional(),
        }),

        platformPassword: joi.alternatives().conditional('platform', {
          is: 'SinDelantal',
          then: joi.string().required(),
        })
        .conditional('platform', {
          is: joi.not(joi.valid('sinDelantal')),
          then: joi.string().allow('').optional(),
        }),
      }).required(),
    });

但我的问题是

  1. 当平台是 Kronh 时,就会显示此描述 description: '“platformConfig.platformApiKey” 不允许为空',

即使我说它是可选的,允许空白 2)当平台是任何平台并且我将值留空时,测试通过。

我阅读了文档,我正在寻求帮助,看看我错过了什么

JavaScript 乔伊

评论


答:

0赞 Lexnotor 10/19/2023 #1

我尝试对每个键只使用一个,它似乎有效。另外,我认为更好的参考平台方式是.alternatives().conditional()...platform

通常,您不需要使用嵌套Joi.object()

试试这个

const body = {
  platform: "Uber",
  platformConfig: {
    platformApiKey: "someApiKey",
    platformUser: "",
    platformPassword: undefined,
  },
};

const schema = Joi.object({
  platform: Joi.string().valid("Uber", "DIDI", "SinDelantal").required(),
  platformConfig: {
    platformApiKey: Joi.alternatives().conditional("...platform", {
      is: Joi.string().equal("Uber", "DIDI"),
      then: Joi.string().required(),
      otherwise: Joi.any().optional(),
    }),
    platformUser: Joi.alternatives().conditional("...platform", {
      is: Joi.string().equal("SinDelantal"),
      then: Joi.string().required(),
      otherwise: Joi.any().optional(),
    }),
    platformPassword: Joi.alternatives().conditional("...platform", {
      is: Joi.string().equal("SinDelantal"),
      then: Joi.string().required(),
      otherwise: Joi.any().optional(),
    }),
  },
});

评论

0赞 Roland Rios 10/20/2023
成功了!!非常喜欢你!!你能解释一下吗?为什么“......platform“,而不是”platform”
0赞 Lexnotor 10/20/2023
platform是对键的引用。我们应该只使用它与 相同的嵌套级别。但在这里,它是在父级层面上。您可以考虑作为到达的路径。您可以在此处找到不同的路径模型platformplatformApiKey...platform