Joi 表单验证时如何动态添加校验规则?

程序员长春 阅读 3

我用 Joi 做前端表单验证,但有个字段的校验规则要根据另一个字段的值动态变化。比如当“用户类型”是“企业”时,“公司名称”才必填。试过在 schema 里用 Joi.when(),但一直报错说方法不存在,是不是我用法不对?

这是我的代码:

const schema = Joi.object({
  userType: Joi.string().valid('individual', 'company').required(),
  companyName: Joi.string().when('userType', {
    is: 'company',
    then: Joi.required(),
    otherwise: Joi.optional()
  })
});
我来解答 赞 1 收藏
二维码
手机扫码查看
1 条解答
西门秋梓
看起来你的用法基本是对的,但 Joi 的 when 语法需要特别注意一些细节。我来帮你优化一下这段代码,这样更清晰也更容易维护。

首先,Joi.when() 需要完整的引用路径,而且 thenotherwise 里面的规则要完整定义。这里有个更优雅的写法:

const schema = Joi.object({
userType: Joi.string().valid('individual', 'company').required(),
companyName: Joi.string().when('userType', {
is: 'company',
then: Joi.string().required(),
otherwise: Joi.string().allow('')
})
});


注意到几个地方:在 thenotherwise 里面都显式定义了 Joi.string(),并且用了 allow('') 来允许空值。这样处理企业用户时能正常校验,而个人用户可以不填这个字段。

有时候这种动态规则确实让人头疼,调试时记得打印出错误信息看看具体问题在哪。希望这能帮到你。
点赞
2026-03-29 20:00