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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 11:22:14