Express-validator传入错误输入仍返回空错误数组如何解决?
问题原因
你对express-validator的使用方式不符合官方要求,核心问题是校验规则的执行时机和位置错误:
- 你写在
login请求处理函数内部的body("email").isEmail(), body("password").isLength({ min: 5 })两行代码,仅完成了校验中间件实例的创建,没有实际触发对当前请求req的校验逻辑,所以validationResult(req)无法采集到错误信息,只会返回空的错误数组。
修复方案
express-validator的校验规则需要作为路由中间件,提前注册到对应接口的执行链路中,具体修改方式如下:
- 路由定义处新增校验中间件
将校验规则数组放在路由路径和业务处理函数之间,示例如下:
const { body, validationResult } = require('express-validator'); // 原路由写法(示例) // app.post('/login', login) // 修改后的路由写法 app.post('/login', [ // 校验规则移到此处 body("email").isEmail().withMessage("邮箱格式不正确"), body("password").isLength({ min: 5 }).withMessage("密码长度不能小于5位") ], login );
- 移除
login函数内冗余的校验规则创建代码
删除login函数里try块开头的那两行body相关代码,保留validationResult的调用即可,修改后的login函数核心逻辑如下:
login = async (req, res) => { try { // 移除原有的两行body校验代码,仅保留校验结果采集逻辑 const errors = validationResult(req); console.log(errors); if (!errors.isEmpty()) { return res.status(400).json({ errors: errors.array() }); } // 剩余原有业务逻辑不变 const user = await User.findOne({ where: { email: req.body.email } }); if (!user) { return res .status(400) .json({ error_msg: "An account for this email does not exist" }); } const validPass = await bcrypt.compare(req.body.password, user.password); if (!validPass) { return res.status(400).json({ error_msg: "E-mail or password is wrong" }); } const token = await getSignedToken(user); return res.status(200).json({ token: token }); } catch (error) { return res.status(400).json({ error_msg: error.message }); } };
修改完成后,请求进入业务处理函数前会先执行校验规则,不符合要求的参数就会被正常捕获,validationResult就能返回对应的错误信息。
内容的提问来源于stack exchange,提问作者kpako1998
相关产品推荐
相关产品推荐

