express-validator 条件验证:仅非空时校验邮箱格式
问题描述
我有一个收集用户邮箱和密码的表单,已经用express-validator配置了验证规则,用来检查邮箱、密码是否为空,以及邮箱格式是否合法,代码如下:
const loginSchema = [ body("email") .isEmail() .withMessage("email must contain a valid email address") .notEmpty() .withMessage("please enter email"), body("password").notEmpty().withMessage("please enter password"), ];
在Postman测试时,如果用户未输入邮箱和密码,会同时显示所有错误信息。我想通过express-validator的条件验证实现:仅当请求体中的邮箱不为空时,才触发isEmail()格式校验及对应提示。
解决方案
方法一:用.bail()中断后续验证
调整验证规则的顺序,先检查邮箱是否为空,再用.bail()方法——如果notEmpty()验证失败(也就是邮箱为空),直接终止当前字段的后续验证,不会触发isEmail()的校验。修改后的代码:
const loginSchema = [ body("email") .notEmpty() .withMessage("please enter email") .bail() // 邮箱为空时,停止后续验证 .isEmail() .withMessage("email must contain a valid email address"), body("password").notEmpty().withMessage("please enter password"), ];
这样用户未输入邮箱时,只会返回“please enter email”的错误,不会出现格式校验的提示。
方法二:用.when()条件触发验证
如果需要更灵活的条件控制,可以用.when()明确指定:只有当邮箱不为空时,才执行格式校验。代码如下:
const loginSchema = [ body("email") .notEmpty() .withMessage("please enter email") .when((value) => value !== "", { then: (validator) => validator.isEmail().withMessage("email must contain a valid email address"), }), body("password").notEmpty().withMessage("please enter password"), ];
这种方式会先校验邮箱是否为空,只有邮箱存在且不为空的情况下,才会启动邮箱格式验证。
内容的提问来源于stack exchange,提问作者Ope Afolabi
相关产品推荐
相关产品推荐

