Node.js(Express)如何在Controller而非app.js中接收表单数据
解决Express MVC架构中表单数据无法传递到userController的问题
出现TypeError: Cannot read property 'name' of undefined的核心原因是req.body未被正确解析,以下是针对性的修复步骤:
1. 确保中间件顺序正确且路由模块正确导入
在app.js中,必须先加载请求体解析中间件,再挂载路由模块,同时补全缺失的模块导入:
const express = require('express'); const mysql = require('mysql'); const expressValidator = require('express-validator'); const cookieParser = require('cookie-parser'); const session = require('express-session'); const flash = require('connect-flash'); const path = require('path'); // 补全path模块导入 const routes = require('./root'); // 导入路由模块,根据root.js实际路径调整 const app = express(); // 使用Express内置的请求体解析器(适配4.16+版本,替代单独的body-parser) app.use(express.urlencoded({ extended: true })); app.use(express.json()); // 挂载路由必须在解析器之后 app.use('/', routes); app.set('view engine', 'pug'); app.set('views', path.join(__dirname, 'views')); app.use(express.static(__dirname + '/public')); app.use(cookieParser('keyboard cat')); const PORT = 4000 app.listen(PORT, function (err) { if (err) console.log(err); console.log("App started on PORT", PORT); });
2. 修复userController的定义与导出
确保userController是完整的导出对象,避免变量未定义问题:
// userController.js const userController = {}; userController.signup = function (req, res, next) { // 渲染注册页面逻辑 res.render('signup'); }; userController.save = function (req, res, next) { // 先打印整个req.body确认数据是否存在 console.log('请求体数据:', req.body); // 使用可选链操作符避免报错 const name = req.body?.name; console.log('获取到的name:', name); // 必须响应客户端,避免请求挂起 res.send(`已收到名称:${name}`); }; userController.login = function (req, res, next) { // 登录页面逻辑 res.render('login'); }; userController.dash = function (req, res, next) { // 仪表盘逻辑 res.render('dash'); }; module.exports = userController;
3. 确保controllers入口文件正确导出
如果使用controllers/index.js统一导出控制器,需保证内容如下:
// controllers/index.js const homeController = require('./homeController'); const userController = require('./userController'); module.exports = { homeController, userController };
4. 检查前端表单配置
确保表单使用POST方法,且enctype为默认的application/x-www-form-urlencoded(无需手动指定):
<!-- 示例signup.pug模板 --> form(action="/signup" method="POST") input(type="text" name="name" placeholder="请输入姓名") button(type="submit") 提交注册
完成以上步骤后,表单提交的数据就能被正确解析并传递到userController.save方法中。
内容的提问来源于stack exchange,提问作者amit
相关产品推荐
相关产品推荐

