express-validator未触发Body错误验证,求助排查方向
解决express-validator验证中间件未触发的问题
你的代码问题在于:check() 方法只是生成一个验证规则的中间件函数,而非直接执行验证逻辑。你现在的写法只是创建了规则,但没有把它注入到当前请求的处理流程中,所以验证不会生效。
两种可行的修正方案:
方案1:拆分验证规则与结果处理(推荐的标准写法)
把验证规则定义为中间件数组,在路由中直接使用:
const { check, validationResult } = require("express-validator"); // 定义验证规则的中间件数组 const userValidationRules = () => { return [ check("email", "Must be a valid email").isEmail() ]; }; // 统一处理验证结果的中间件 const validate = (req, res, next) => { const errors = validationResult(req); if (!errors.isEmpty()) { return res.json(errors); } next(); }; module.exports = { userValidationRules, validate };
然后在路由中注册使用:
const { userValidationRules, validate } = require("./你的验证文件路径"); app.post("/users", userValidationRules(), validate, (req, res) => { // 这里处理通过验证后的请求逻辑 });
方案2:在单个中间件中手动执行验证
如果要保持单个中间件的结构,需要使用run()方法手动将验证规则绑定到当前请求(注意要使用异步函数):
const { body, validationResult } = require("express-validator"); module.exports = { async validateUsers(req, res, next) { if (req.method === "POST") { console.log(req.body.email); // 手动执行验证规则并绑定到当前请求 await body("email", "Must be a valid email").isEmail().run(req); } const errors = validationResult(req); if (!errors.isEmpty()) { return res.json(errors); } else { return next(); } } };
关键说明:
- 旧版本的
checkBody在新版中已被body()替代,直接使用body()指定字段更清晰。 - 验证规则必须通过中间件链执行,或者手动调用
run(req)才能将错误收集到req中,之后validationResult(req)才能获取到错误信息。
内容的提问来源于stack exchange,提问作者rainydaymatt
相关产品推荐
相关产品推荐

