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

Joi校验配置:字段可选允许null,传值需为正整数如何实现

解决方案

正确实现代码

不需要额外使用.when做条件判断,直接在capacity字段上配置规则即可:

const divebarSchema = joi.object({
  divebar: joi
    .object({
      title: joi.string().required(),
      // 核心校验规则,按需调整min值即可:要正整数填1,允许0填0
      capacity: joi.number().integer().min(1).optional().nullable(),
      description: joi.string().required(),
      location: joi.string().required(),
      image: joi.string().optional().allow(""),
      map: joi.string().optional().allow(""),
    })
    .required()
});

规则说明

  • .optional():字段允许为undefined,也就是不传该字段也能通过校验,这本身就是JOI字段的默认行为,不加也能生效
  • .nullable():显式声明字段允许值为null,会自动绕过number类型校验对null的拦截
  • .integer().min(1):只要传入的值不是undefined和null,就必须符合正整数的校验规则

旧版本兼容写法

如果你使用的是JOI v16之前的版本,没有nullable()方法,可以用下面的兼容写法实现同样效果:

capacity: joi.alternatives().try(
  joi.number().integer().min(1),
  joi.null()
).optional()

之前写法失效的原因

  1. 最初的joi.number().optional().allow(null).integer().min(0)写法报错,是因为JOI的类型校验优先级高于后续的allow(null)配置,null会先被number()的类型校验判定为非法,还没走到allow(null)规则就抛出了错误,换成nullable()就能解决这个问题。
  2. 你写的.when逻辑完全多余,而且绑定在父级divebar对象上,匹配规则编写也有问题,所以不会生效,这类单字段的独立规则直接在字段本身配置即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 02:06:02