如何在 Joi 中使用动态键

How can I use Dynamic key in Joi

我是 Joi 的初学者。

我想使以下 'folderContent' 成为一个动态值,它可以是 'onlySubject' 或 'otherDetails' 或我将在运行时作为输入提供的任何值。

详情:在schema('bodySchema')中,有一个object('superObject'),下面还有一个object('folderContent') , 其中有一个字符串 ('subject')

const bodySchema=Joi.object({
superObject: Joi.object()
    .when('grade', {
      is: 'class6',
      then: {
        folderContent: Joi.object({
            subject: Joi.string(),
          }),
      },
    })
});

所以输入看起来像下面这样,而不是 'folderContent' 我想给出动态键值

"superObject": {
        "folderContent": {
            "subject": "Geography"
        }
    }

我尝试了以下方法,但没有用: 1)超级对象:Joi.object() .when('grade', { 是:'class6', 然后:{

    folderContent: Joi.object()
      .keys({
        subject: Joi.string(),
      })
      .unknown(true),
    
  },
})

2)超级对象:Joi.object() .when('grade', { 是:'class6', 然后:{

    folderContent: Joi.object()
      ({
        subject: Joi.string(),
      })
      .unknown(true),
    
  },
})

当我为 'folderContent' 输入 'onlySubject' 时出现错误 { “成功”:假的, “异常”:“无效的身体参数”, "message": ""superObject.onlySubject" 是不允许的", “堆栈”:“验证错误:不允许使用“superObject.onlySubject”” }

如果您的对象具有这种结构:

{ 
  superObject: {
    folderContent: {
      subject: "Geography"
    }
  }
}

folderContent可以是动态字符串键,可以使用object.pattern():

Joi.object({
  superObject: Joi.object().pattern(
    Joi.string(),
    Joi.object({
        subject: Joi.string()
    })
  )
})

这样,您的 superObject 对象可以包含您想要的任何键,并且该键必须包含另一个具有键 subject.

的对象

例如,这个对象将是有效的:

{ 
  superObject: {
    aaabbbccc: {
      subject: "Geography"
    }
  }
}

只要保留 superObjectsubject.

键,您可以将键 aaabbbcc 更改为您想要的任何值

编辑:这是alternative/simpltification您的条件:

Joi.object({
  superObject: Joi.object().pattern(
    Joi.string(),
    Joi.object({
        subject: Joi.string(),
        pattern: Joi.string().when('...grade', {
          is: 'class6', 
          then: Joi.forbidden() 
        })
    })
  )
})

我们在这里“说”的是,如果gradeclass6,那么pattern是禁止的,否则它将与subject一起有效。如果这些是唯一有效的选项,您甚至可以添加 Joi.string().valid('class6', 'class7')

明白了,下面的工作正常。在你的模式的帮助下它成功了,非常感谢。

superObject
: Joi.object()

    .when(‘grade’, {
      is: ‘class6’,
      then: Joi.object().pattern(
        Joi.string(),
        Joi.object({
          subject: Joi.string(),
        })
      ),
    })
    .when(‘grade’, {
      is: ‘class5’,
      then: Joi.object().pattern(
        Joi.string(),
        Joi.object({
          subject: Joi.string(),
          Pattern: Joi.string(),
        })
      ),
    }),