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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 05:45:40