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

Express提交multipart/form-data表单时req.body为undefined问题求助

问题原因

req.body返回undefined的核心原因是:你的EJS表单设置了enctype="multipart/form-data"编码类型,但Express内置的express.json()、express.urlencoded()中间件,以及你之前尝试使用的body-parser包,都不支持解析multipart格式的请求体,自然无法读取提交的参数。

解决方案

根据你是否需要在该表单中上传文件,二选一即可:

方案1:无需上传文件,仅提交普通文本字段

直接删除EJS表单标签上的enctype="multipart/form-data"属性即可。
表单默认会使用application/x-www-form-urlencoded编码提交,刚好匹配你已经配置好的express.urlencoded()中间件,修改后重启服务就能正常读取req.body的内容。
修改后的EJS表单代码:

<body>
  <form action="/upload-new" method="post">
    <input type="text" name="name" />
    <button type="submit">submit</button>
  </form>
</body>

方案2:需要上传文件,必须保留multipart/form-data编码

这种场景需要使用专门处理multipart格式请求的中间件,推荐使用multer,配置步骤如下:

  • 第一步:安装依赖
npm install multer
  • 第二步:修改路由代码,引入并配置multer中间件,注意要把解析中间件放在路由定义之前:
var express = require("express");
var router = express();
require("dotenv").config();
var mongoose = require("mongoose");
// 引入multer
var multer = require('multer')
// 配置上传实例:仅处理文本字段时用内存存储即可,需要存本地文件可以自定义磁盘存储规则
var upload = multer({ storage: multer.memoryStorage() })

router.use(express.json());
router.use(express.urlencoded({ extended: true }));

router.get("/upload-new", function (req, res) {
  res.render("forum2");
});

// 给对应POST接口挂载multer中间件,无文件上传时传空参数调用array()即可,有文件时可配置接收的文件字段
router.post("/upload-new", upload.array(), function (req, res) {
  console.log(req.body.name); // 此处可正常获取提交的name参数
  // 若有上传文件,文件内容会存放在req.files对象中
});
额外说明

你当前的中间件注册顺序是正确的,请求体解析类中间件必须放在对应路由定义之前才会生效,不需要额外安装已经被Express内置替代的旧版body-parser包,安装后也无法解决multipart格式解析的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:36:18