根据 Joi 中其他多个参数的值设置请求参数的规则

Set rules for a request parameter based on the values of other multiple parameters in Joi

我正在使用 Joi 来验证对我的 API 的请求。

我正在努力实现以下目标:

  1. 如果平台是aws,引擎是premium,那么场地间距不应该存在。
  2. 在其他情况下,场地间距是可选的,有效值为 defaultx-lowlowmediumhighx-high.

我试过类似的方法,但它对我不起作用。

 const schema = Joi.object({
        platform: Joi.string().valid("aws","google","azure").required(),
        engine: Joi.string().valid("standard","premium").required(),
        pitch: Joi.when(Joi.object({platform: Joi.valid('aws'), engine: Joi.valid('premium')}),{
            then: Joi.forbidden(),
            otherwise: Joi.string().valid('default', 'x-low', 'low', 'medium', 'high', 'x-high'),
        })
 });

知道如何使用 Joi 实现这一点吗?

你的应该是相对于你的对象:

Joi.object({
    platform: Joi.string().valid("aws","google","azure").required(),          
    engine: Joi.string().valid("standard","premium").required(),                     
    pitch: Joi.string().valid('default', 'x-low', 'low', 'medium', 'high', 'x-high'),
})
    .when(Joi.object({ platform: Joi.valid('aws'), engine: Joi.valid('premium') }).unknown(), {
        then: Joi.object({ pitch: Joi.forbidden() })
    })

platformawsengine[=] 时,此架构将禁止 pitch 18=] 是 premium

const pitch = Joi.when(
  'platform', {
    is: 'aws',
    then: Joi.when(
      'engine', {
        is: 'premium',
        then: Joi.forbidden(),
        otherwise: Joi.string().valid('default', 'x-low', 'low', 'medium', 'high', 'x-high')
      }
    )
  }
)

const schema = Joi.object({
  platform: Joi.string().valid("aws", "google", "azure").required(),
  engine: Joi.string().valid("standard", "premium").required(),
  pitch
});