@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()方法实现,不需要额外写判断逻辑,规则维护更统一:
改完后可以删除路由中手写的空值判断代码,统一走Joi校验流程,错误格式也能保持一致。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); };
内容的提问来源于stack exchange,提问作者user16949958
相关产品推荐
相关产品推荐

