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()
之前写法失效的原因
- 最初的
joi.number().optional().allow(null).integer().min(0)写法报错,是因为JOI的类型校验优先级高于后续的allow(null)配置,null会先被number()的类型校验判定为非法,还没走到allow(null)规则就抛出了错误,换成nullable()就能解决这个问题。 - 你写的
.when逻辑完全多余,而且绑定在父级divebar对象上,匹配规则编写也有问题,所以不会生效,这类单字段的独立规则直接在字段本身配置即可。
内容的提问来源于stack exchange,提问作者Yob
相关产品推荐
相关产品推荐

