You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Joi中使用动态键实现对象键名运行时自定义

Joi实现superObject下动态二级键的配置方案

问题核心原因

你之前的写法错误点在于:将folderContent作为固定键定义,仅给该键内部配置了unknown(true),这个配置只允许folderContent对象内部存在额外字段,不会让superObject层级允许其他自定义键名,因此传入非folderContent的键时会触发「字段不允许」的报错。

正确配置方案

使用Joi的pattern()方法匹配对象下的所有动态键,统一约束所有动态键的值结构:

const bodySchema = Joi.object({
  // 必须先定义grade字段,否则when条件无法生效,可根据你的业务补充其他有效值
  grade: Joi.string().valid('class6').required(),
  superObject: Joi.object()
    .when('grade', {
      is: 'class6',
      then: Joi.object()
        // 第一个参数匹配键名规则:此处为任意字符串键
        // 第二个参数约束对应值的结构:必须包含字符串类型的subject字段
        .pattern(
          Joi.string(),
          Joi.object({
            subject: Joi.string() // 若subject为必填项可追加.required()
          })
        )
        // 可选配置:如果要求superObject下只能存在1个动态二级键,保留这行,不需要可删除
        .length(1)
      // 可选配置:grade非class6时的superObject规则,示例为允许任意结构
      // otherwise: Joi.object().unknown(true)
    })
});

验证效果

以下输入可以正常通过校验:

{
  "grade": "class6",
  "superObject": {
    "onlySubject": {
      "subject": "Geography"
    }
  }
}

如果动态二级键缺失subject字段、subject类型不是字符串,都会触发对应的校验报错,符合你的需求。


内容的提问来源于stack exchange,提问作者user15658079

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 13:24:04