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

如何通过Node.js获取Jade表单数据?提交后req.body为undefined

解决Express中表单提交后req.body为undefined的问题

问题核心原因

Express框架默认不会自动解析表单提交的请求体数据,必须手动配置对应的中间件来处理application/x-www-form-urlencoded类型的表单数据(这是普通HTML表单默认的编码格式)。另外你表单里的_method隐藏字段,还需要额外中间件来处理请求方法的转换。

具体解决方案

1. 配置表单解析中间件

在你的Express主应用文件(通常是app.js)中添加以下代码,启用内置的表单解析中间件:

var express = require('express');
var app = express();

// 解析application/x-www-form-urlencoded格式的请求体
app.use(express.urlencoded({ extended: true }));

2. 处理_method的请求方法转换(可选但必要)

因为你的表单用POST方法提交,但通过_method字段指定了实际要使用PUT方法,需要安装并配置method-override中间件:

  • 先安装依赖:
npm install method-override
  • 在app.js中添加配置:
var methodOverride = require('method-override');
// 读取请求中的_method参数来转换请求方法
app.use(methodOverride('_method'));

3. 调整路由匹配逻辑

由于表单的action是/userCreation,且实际请求方法会被转换为PUT,需要把路由中的router.post改为router.put,确保路由能匹配到转换后的请求:

var express = require('express');
var router = express.Router();
var user_dao = require('sport-track-db').user_dao;

router.get('/', function(req, res, next) {
    res.render('user_creation');
});

// 改为PUT路由匹配转换后的请求
router.put('/', function(req, res, next) {
    console.log("ah");
    console.log(req.body); // 现在能正常获取表单数据了
    // 可通过req.body.name、req.body.email、req.body.age分别获取对应字段值
});

module.exports = router;

4. 确认路由挂载路径

确保主应用文件中路由的挂载路径和表单action一致:

// 假设你的路由文件路径是./routes/user_creation
var userCreationRouter = require('./routes/user_creation');
app.use('/userCreation', userCreationRouter);

完成以上配置后,再次提交表单,终端就能正常打印出表单提交的req.body数据了。

内容的提问来源于stack exchange,提问作者Flantier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:40:35