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
相关产品推荐
相关产品推荐

