如何使用Joi验证对象内部的对象类型约束?
修正你的Joi对象验证规则
首先直接给结论:你当前写的校验规则不正确,而且不是简单把string换成object就能解决的——因为slots是一个对象数组,需要用Joi的数组校验结合内部对象的约束来处理。
问题分析
你的目标对象结构是:
let login = { value: 0/1, // 应为0或1的数字 slots: [ { label: '', value: '24 hr'}, { label: '', value: '24 hr'} ] // 对象数组 };
但你当前的schema把slots定义为Joi.string().required(),这完全不符合实际数据类型;如果换成Joi.object()也不对,因为它是数组而非单个对象。
正确的校验规则写法
你需要用Joi.array()来声明slots的数组类型,再用.items()来定义数组中每个对象的具体校验约束。同时可以给value字段加上更精确的范围限制(只允许0或1):
const schema = Joi.object().keys({ // 验证value是0或1的必填数字 value: Joi.number().valid(0, 1).required(), // 验证slots是必填的对象数组,每个元素符合指定结构 slots: Joi.array() .items( Joi.object().keys({ label: Joi.string().allow(''), // 允许空字符串,若不允许可去掉.allow('') value: Joi.string().valid('24 hr').required() // 限制value只能是'24 hr' }) ) .required() });
关键说明
Joi.number().valid(0, 1):确保value只能是0或1,比单纯的Joi.number()更精确,匹配你的需求Joi.array().items(...):明确slots是数组,并且每个元素必须匹配括号内的对象校验规则- 内部对象的
label和value可以根据实际需求调整约束:比如如果label不允许为空,就删掉.allow('');如果value有其他可选值,在valid()里添加即可,比如valid('24 hr', '12 hr')
这样修改后,就能准确验证你描述的对象结构和类型约束了。
内容的提问来源于stack exchange,提问作者Swati Dixit
相关产品推荐
相关产品推荐

