express-validator报错:req.checkBody is not a function问题求助
解决
TypeError: req.checkBody is not a function 问题 我明白你折腾了2小时的沮丧感,咱们一步步拆解问题、解决它:
问题根源梳理
你的代码里有几个关键问题,导致express-validator没能正确挂载到Express的请求对象上:
- 重复的请求解析中间件冲突:Express 4.16.0+已经内置了
body-parser的功能,你在app.js里同时用了第三方body-parser和Express内置的解析器,这会造成逻辑冲突 express-validator挂载位置错误:你在路由文件index.js里创建了新的Express实例并挂载校验中间件,但这个实例和主应用的app不是同一个;主应用的app.js里虽然引入了express-validator,却没调用app.use(expressValidator())启用它- 路由文件的冗余配置:路由模块不需要重新创建Express实例,只用
express.Router()即可
具体修复步骤
步骤1:清理app.js里的重复配置
修改app.js,移除第三方body-parser的依赖和调用,改用Express内置的解析器,并正确挂载express-validator:
// app.js var createError = require('http-errors'); var express = require('express'); var path = require('path'); var cookieParser = require('cookie-parser'); var logger = require('morgan'); var expressValidator = require('express-validator'); // 保留校验库引入 var indexRouter = require('./routes/index'); var usersRouter = require('./routes/users'); var app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'pug'); // 保留Express内置的解析器,移除第三方body-parser的调用 app.use(logger('dev')); app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); // 关键:在解析器之后挂载express-validator app.use(expressValidator()); app.use('/', indexRouter); app.use('/users', usersRouter); // 错误处理代码保持不变 app.use(function(req, res, next) { next(createError(404)); }); app.use(function(err, req, res, next) { res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; res.status(err.status || 500); res.render('error'); }); module.exports = app;
步骤2:简化index.js的路由配置
路由模块不需要重新创建Express实例,删除冗余的中间件配置:
// index.js var express = require('express'); var router = express.Router(); router.get('/', function(req, res, next) { res.render('index', { title: 'Express' }); }); router.get('/signup', function(req, res, next) { res.render('signup', { title: 'Express' }); }); router.post('/signup', function(req, res){ var name = req.body.name; console.log(name); //works req.checkBody("name", "Invalid name").notEmpty(); var errors = req.validationErrors(); if(errors){ console.log('errors:', errors); // 打印具体错误信息方便排查 } else{ console.log('no errors'); } res.end(); // 记得结束请求,避免客户端挂起 }); module.exports = router;
步骤3:校验依赖安装
确保express-validator已正确安装,在项目根目录执行:
npm list express-validator
如果显示express-validator@5.2.0说明安装正常;如果没有,执行npm install express-validator@5.2.0重新安装。
额外提示
如果你之后升级express-validator到6.x及以上版本,API会有变化(比如checkBody会被body()替代),但你当前使用的5.x版本完全兼容checkBody,暂时不需要修改API。
最后重启你的Node服务,再测试表单提交,应该就能解决这个报错了。
内容的提问来源于stack exchange,提问作者gorbut
相关产品推荐
相关产品推荐

