如何解决ExpressJS控制器中Postman Form Data请求体为空问题?
问题:Express中使用Form Data传递参数时req.body为空
我用Express开发创建产品的接口,因需上传图片,使用Postman的Form Data标签传递参数,但始终无法获取req.body的值,控制台输出为空对象。
相关代码
app.js
import express from "express"; const app = express(); app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.use("/products", router);
router.js
import { Router } from "express"; const router = Router() productRouter.post("/add", newproduct) export default router;
product.controller.js
const newproduct = (req, res) => { try { console.log('body', req.body) // 临时返回固定响应 res.status(201).json({ message: "Product created successfully" }); } catch (error) { res.status(500).json(error) } };
问题原因
当前使用的express.json()和express.urlencoded()中间件仅支持解析JSON、application/x-www-form-urlencoded格式的数据,完全不支持multipart/form-data格式——这正是Form Data对应的请求格式,所以req.body才会是空对象。
解决步骤
1. 安装multer依赖
multer是Express生态中专门处理multipart/form-data(含文件上传)的中间件,执行命令安装:
npm install multer
2. 配置并使用multer中间件
修改路由文件,引入并配置multer,将其挂载到目标接口上:
// router.js import { Router } from "express"; import multer from "multer"; const router = Router() // 配置文件存储规则(可选:如果需要将文件保存到本地) const storage = multer.diskStorage({ destination: (req, file, cb) => { cb(null, 'uploads/') // 需提前在项目根目录创建uploads文件夹 }, filename: (req, file, cb) => { // 生成唯一文件名,避免重复覆盖 cb(null, `${Date.now()}-${file.originalname}`) } }) // 初始化multer:如果不需要保存文件,直接用`const upload = multer()`即可 const upload = multer({ storage: storage }) // 挂载中间件:single('image')表示接收名为image的单个文件,需和Postman中的文件字段名一致 router.post("/add", upload.single('image'), newproduct) export default router;
3. 在控制器中获取数据
现在req.body可以拿到Form Data中的普通文本参数,req.file(单文件场景)或req.files(多文件场景)可以拿到上传文件的详细信息:
// product.controller.js const newproduct = (req, res) => { try { console.log('表单文本参数', req.body); console.log('上传文件信息', req.file); res.status(201).json({ message: "Product created successfully", formData: req.body, fileInfo: req.file }); } catch (error) { res.status(500).json(error) } };
4. Postman验证注意事项
- 确保Form Data中的文件字段名,和
upload.single('xxx')中的xxx完全一致 - 无需手动设置请求头,Postman会自动为Form Data请求添加
Content-Type: multipart/form-data头
内容的提问来源于stack exchange,提问作者Jim Parsons
相关产品推荐
相关产品推荐

