如何在Joi Schema属性中禁用多个正则表达式模式?
解决Joi Schema禁用多个正则表达式模式的问题
你之前的两种写法都存在问题:
- 第一种用
.invalid()的思路不对,.invalid()是用来排除具体值的,无法用来排除匹配正则规则的字符串,所以不会生效。 - 第二种用
alternatives后加.not().match('all')的方式,因为alternatives属于类型分支规则,和你需要的string基础类型冲突,所以抛出了类型合并错误。
给你两种可行的解决方法:
方法一:用.not()结合alternatives.try()
直接在字符串规则里用.not()排除匹配任意目标正则的情况,把要禁用的正则模式用alternatives.try()组合起来:
const schema = Joi.object({ a: Joi.string().not( Joi.alternatives().try( Joi.string().pattern(/^\d+$/), Joi.string().pattern(/^Hello \d+$/) ) ) });
方法二:合并正则并启用invert选项
把多个禁用的正则用|合并成一个正则表达式,然后在.pattern()里设置invert: true,表示不匹配该正则的字符串才符合规则,这种写法更简洁:
const schema = Joi.object({ a: Joi.string().pattern(/^\d+$|^Hello \d+$/, { invert: true }) });
这两种方式都能实现你要的「禁用多个正则模式」的效果,你可以根据实际场景选择。
内容的提问来源于stack exchange,提问作者MaterialZ




