运行Node.js服务器遇Route.post()回调未定义错误求助
问题解决:Route.post() requires a callback function but got a [object Undefined]
错误日志
Node.js v20.11.0 PS C:\Users\Edward Akande\mern-boilerplate\backend> node Server.js C:\Users\Edward Akande\mern-boilerplate\backend\node_modules\express\lib\router\route.js:216 throw new Error(msg); ^ Error: Route.post() requires a callback function but got a [object Undefined] at Route.<computed> [as post] (C:\Users\Edward Akande\mern-boilerplate\backend\node_modules\express\lib\router\route.js:216:15) at proto.<computed> [as post] (C:\Users\Edward Akande\mern-boilerplate\backend\node_modules\express\lib\router\index.js:521:19) at Object.<anonymous> (C:\Users\Edward Akande\mern-boilerplate\backend\routes\auth.js:10:8) at Module._compile (node:internal/modules/cjs/loader:1376:14) at Module._extensions..js (node:internal/modules/cjs/loader:1435:10) at Module.load (node:internal/modules/cjs/loader:1207:32) at Module._load (node:internal/modules/cjs/loader:1023:12) at Module.require (node:internal/modules/cjs/loader:1235:19) at require (node:internal/modules/helpers:176:18) at Object.<anonymous> (C:\Users\Edward Akande\mern-boilerplate\backend\Server.js:15:22)
错误原因
报错指向auth.js第10行的注册路由:router.post('/register', registerValidation, async (req, res) => {}),核心问题是你导入的registerValidation不存在——当前middleware/validation.js仅导出了一个JWT验证中间件,完全没有定义注册表单验证的registerValidation函数,导致传入Route.post的第二个参数是undefined,触发Express的路由回调必填校验。
修复方案
1. 更新middleware/validation.js,添加注册验证规则并规范导出
将原有的单一导出改为命名导出,新增registerValidation验证规则:
const jwt = require('jsonwebtoken'); const User = require('../models/user.js'); const { body } = require('express-validator'); // 注册表单验证规则:校验邮箱格式、密码长度 exports.registerValidation = [ body('email').isEmail().withMessage('请输入有效的邮箱地址'), body('password').isLength({ min: 6 }).withMessage('密码长度至少为6位') ]; // JWT身份验证中间件(原有的验证逻辑) exports.authMiddleware = async function (req, res, next) { const token = req.header('x-auth-token'); if (!token) { return res.status(401).json({ msg: 'No token, authorization denied' }); } try { const decoded = jwt.verify(token, process.env.JWT_SECRET); const user = await User.findById(decoded.user.id); if (!user) { return res.status(401).json({ msg: 'Token is not valid' }); } req.user = user; next(); } catch (err) { console.error(err.message); res.status(500).json({ msg: 'Server Error' }); } };
2. (可选)修复User模型缺失字段
你的verify-code路由中用到了user.verificationCode,但当前User模型没有这个字段,需要在models/user.js中补充:
const userSchema = new mongoose.Schema({ email: { type: String, required: true, unique: true }, password: { type: String, required: true }, accountType: { type: String, enum: ['Admin', 'Paid', 'Free'], default: 'Free' }, verified: { type: Boolean, default: false }, verificationCode: { type: String } // 新增此字段 });
3. (可选)添加便捷启动脚本
在package.json中添加启动脚本,方便开发和生产环境使用:
"scripts": { "start": "node Server.js", "dev": "nodemon Server.js", "test": "echo \"Error: no test specified\" && exit 1" }
内容的提问来源于stack exchange,提问作者Edward Akande
相关产品推荐
相关产品推荐

