如何在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
相关产品推荐
相关产品推荐

