Joi 表单验证时如何动态添加校验规则?
我用 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()
})
});
when语法需要特别注意一些细节。我来帮你优化一下这段代码,这样更清晰也更容易维护。首先,
Joi.when()需要完整的引用路径,而且then和otherwise里面的规则要完整定义。这里有个更优雅的写法:注意到几个地方:在
then和otherwise里面都显式定义了Joi.string(),并且用了allow('')来允许空值。这样处理企业用户时能正常校验,而个人用户可以不填这个字段。有时候这种动态规则确实让人头疼,调试时记得打印出错误信息看看具体问题在哪。希望这能帮到你。