使用FormData时req.body为空对象的技术问题求助
问题原因与解决办法
你遇到的req.body为空问题,核心原因有两个:
- 中间件顺序错误:需要读取
req.body的checkIfUpload中间件,放在了负责解析multipart/form-data格式请求的upload.single之前,此时multer还未处理请求,req.body自然为空。 - 请求格式不匹配:
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
相关产品推荐
相关产品推荐

