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

@hapi/joi未设置字段必填仍提示picture不允许为空报错问题

问题原因

@hapi/joi 16+版本中,Joi.string()类型默认禁止空字符串值:只要待校验对象里存在对应字段,即使没有配置required()必填规则,只要字段值是空字符串'',就会抛出string.empty校验错误。
你的请求参数里传了picture: '',字段存在但值为空串,命中默认校验规则,因此触发报错,和字段是否设置必填无关。
另外你的路由中判断两个字段全空的代码用了单&(按位与运算符),不是逻辑与&&,该写法会导致判断逻辑失效,需要修正。

解决方法
  • 方案1:允许字段接收空字符串
    如果业务允许字段传空值,给字符串规则追加.allow('')配置即可,修正后的校验代码:
    module.exports.postsValidation = (data) => {
      const schema = Joi.object({
        textfield: Joi.string().max(280).allow(''),
        picture: Joi.string().allow(''),
      });
    
      return schema.validate(data);
    };
    
  • 方案2:将二选一必填规则整合到Joi校验中
    你在路由里手写的"两个字段至少填一个"的判断,可以直接用Joi内置的.or()方法实现,不需要额外写判断逻辑,规则维护更统一:
    module.exports.postsValidation = (data) => {
      const schema = Joi.object({
        textfield: Joi.string().max(280).allow(''),
        picture: Joi.string().allow(''),
      }).or('textfield', 'picture'); // 约束两个字段至少有一个为非空值
    
      return schema.validate(data);
    };
    
    改完后可以删除路由中手写的空值判断代码,统一走Joi校验流程,错误格式也能保持一致。

内容的提问来源于stack exchange,提问作者user16949958

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 03:12:23