提问人:Roland Rios 提问时间:10/19/2023 更新时间:10/19/2023 访问量:21
Joi 条件验证:基于“platform”验证“platformConfig.platformApiKey”时出错
Joi Conditional Validation: Error When Validating 'platformConfig.platformApiKey' Based on 'platform
问:
我正在使用 joi 进行架构验证。
我需要验证以下数据
"body": {
"event": "someEvent",
"frequency": "someFrequency",
"ApiToken": "samsaraApiToken",
"TelematicsTypes": "someTele",
"platform": "Uber | DIDI | SinDelantal",
"platformConfig": {
"platformApiKey": "someApiKey"
"platformUser": "someUser",
"platformPassword": "somePass"
}
我需要进行以下验证:
- 如果平台是 Uber 或 DIDI,则需要 platformApiKey,用户和密码是可选的
- 如果平台是 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(),
});
但我的问题是
- 当平台是 Kronh 时,就会显示此描述 description: '“platformConfig.platformApiKey” 不允许为空',
即使我说它是可选的,允许空白 2)当平台是任何平台并且我将值留空时,测试通过。
我阅读了文档,我正在寻求帮助,看看我错过了什么
答:
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
是对键的引用。我们应该只使用它与 相同的嵌套级别。但在这里,它是在父级层面上。您可以考虑作为到达的路径。您可以在此处找到不同的路径模型platform
platformApiKey
...
platform
评论