You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express-validator传入错误输入仍返回空错误数组如何解决?

问题原因

你对express-validator的使用方式不符合官方要求,核心问题是校验规则的执行时机和位置错误:

  • 你写在login请求处理函数内部的body("email").isEmail(), body("password").isLength({ min: 5 })两行代码,仅完成了校验中间件实例的创建,没有实际触发对当前请求req的校验逻辑,所以validationResult(req)无法采集到错误信息,只会返回空的错误数组。

修复方案

express-validator的校验规则需要作为路由中间件,提前注册到对应接口的执行链路中,具体修改方式如下:

  1. 路由定义处新增校验中间件
    将校验规则数组放在路由路径和业务处理函数之间,示例如下:
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
);
  1. 移除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 06:54:03