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

使用FormData时req.body为空对象的技术问题求助

问题原因与解决办法

你遇到的req.body为空问题,核心原因有两个:

  1. 中间件顺序错误:需要读取req.body的checkIfUpload中间件,放在了负责解析multipart/form-data格式请求的upload.single之前,此时multer还未处理请求,req.body自然为空。
  2. 请求格式不匹配:express.json()仅能解析application/json格式的请求体,而FormData发送的是multipart/form-data格式,必须靠multer来解析。

具体修复步骤

1. 调整路由中间件顺序

将upload.single("image")移到所有需要读取req.body的中间件之前,让multer先完成请求体解析,后续中间件才能拿到表单数据。

修改后的路由代码:

const express = require(`express`);
const multer = require(`multer`);

const notAuth = require(`../middlewares/not-auth`);
const isAuth = require(`../middlewares/is-auth`);
const checkIfUpload = require(`../middlewares/check-if-upload`);

const fileStorage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, "images/users");
  },
  filename: (req, file, cb) => {
    cb(null, Date.now().toString() + `-` + file.originalname);
  },
});

const fileFilter = (req, file, cb) => {
  if (
    file.mimetype === "image/png" ||
    file.mimetype === "image/jpg" ||
    file.mimetype === "image/jpeg"
  ) {
    cb(null, true);
  } else {
    cb(null, false);
  }
};

const upload = multer({ storage: fileStorage, fileFilter: fileFilter });
const authController = require(`../controllers/auth`);

const router = express.Router();

// 关键调整:multer解析放在checkIfUpload之前
router.post(
  `/signup`,
  upload.single("image"),
  checkIfUpload,
  notAuth,
  authController.signup
);

module.exports = router;

2. Postman请求配置注意事项

  • 确保请求方式为POST,Body选择form-data类型;
  • 文本字段(如email)直接输入值,文件字段选择File类型并上传对应图片,字段名必须和upload.single("image")中的image一致;
  • 不要手动设置Content-Type请求头,Postman会自动生成带边界标识的multipart/form-data头,手动设置会导致解析失败。

3. 保留原有配置

app.js中的express.json()可以保留,它只会处理JSON格式的请求,不会影响multipart/form-data类型的请求解析。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:48:30