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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:27:04