如何基于已有完整Joi Schema仅验证指定字段?
如何基于已有Joi Schema验证部分字段
当然可以实现!你完全不需要拆分多个Schema来处理这种场景,Joi本身就提供了现成的方法,能帮你灵活提取指定字段进行验证,不用额外维护多个Schema副本。
具体实现方案
首先你的原Schema可以保持不变:
const schema = Joi.object({ title: Joi.string().required(), start_date: Joi.date().iso().required(), end_date: Joi.date().iso().greater(Joi.ref('start_date')).required() });
场景1:验证完整对象
直接使用原Schema验证即可,和你之前的写法完全一致:
const obj = { title: 'abc', start_date: '2021-11-09', end_date: '2021-11-10' } const validationResult = schema.validate(obj); // 验证通过,所有必填字段都符合规则
场景2:仅验证指定字段(start_date和end_date)
使用Joi的pick()方法,从原Schema中提取你需要的字段生成一个新Schema,再进行验证:
const obj = { start_date: '2021-11-09', end_date: '2021-11-11' } const validationResult = schema.pick(['start_date', 'end_date']).validate(obj); // 验证通过,此时只会检查start_date和end_date的规则,不会因为缺少title报错
额外实用技巧:排除字段的情况
如果你的需求是排除某些字段而非指定字段,可以用omit()方法,效果和pick()刚好相反。比如不想验证title字段:
const validationResult = schema.omit(['title']).validate(obj); // 效果等同于pick(['start_date', 'end_date'])
这种方式既保留了原Schema的完整性,又能灵活适配不同的验证场景,比拆分多个Schema更简洁易维护。
内容的提问来源于stack exchange,提问作者shuk
相关产品推荐
相关产品推荐

