JOI如何仅对请求Body中存在的字段执行校验
解决方案
Joi 默认就支持仅校验已传入的字段,你不需要给字段加.required()修饰符即可实现需求,具体操作步骤如下:
- 第一步:编写校验Schema时,仅定义每个字段的自身校验规则,不要追加
.required()修饰符
示例代码:const updateUserSchema = Joi.object({ username: Joi.string().min(2).max(20), email: Joi.string().email(), age: Joi.number().min(1).max(120) }) - 第二步:在校验请求Body时,不需要额外特殊配置,Joi会自动跳过所有未在Body中传递的字段的校验,仅对已传入的字段执行规则校验。
如果你需要额外禁止用户传入Schema未定义的冗余字段,可以在校验时添加allowUnknown: false配置:// 示例Express中间件中的校验逻辑 app.put('/users/:id', (req, res, next) => { const { error } = updateUserSchema.validate(req.body, { abortEarly: false, // 可选:一次性返回所有校验错误,而非遇到第一个错误就终止 allowUnknown: false // 可选:禁止传入Schema中未定义的字段 }) if (error) { return res.status(400).json({ message: '参数校验失败', errors: error.details.map(item => item.message) }) } next() })
特殊场景处理
如果你全局配置了Joi的默认校验规则为所有字段必填(比如通过Joi.defaults(schema => schema.options({ presence: 'required' }))设置了全局预设),那你只需要在更新接口的校验配置中覆盖全局预设,添加presence: 'optional'即可:
const { error } = updateUserSchema.validate(req.body, { presence: 'optional' // 覆盖全局必填配置,当前校验所有字段默认可选 })
内容的提问来源于stack exchange,提问作者Ronnei Peterson
相关产品推荐
相关产品推荐

