Postman发送form-data到Node.js Express服务req.body为空问题求助
问题原因
你当前Express项目中配置的express.json()和express.urlencoded()内置中间件,仅支持解析application/json(对应Postman的raw JSON请求)和application/x-www-form-urlencoded格式的请求体,不支持form-data对应的multipart/form-data格式,因此form-data请求的req.body会返回空对象。
解决方案
推荐使用Express生态最常用的multer中间件解析form-data格式请求,操作步骤如下:
- 安装multer依赖
npm install multer
- 根据业务场景配置中间件
场景1:接口仅接收form-data文本字段、无文件上传
直接在对应路由中引入并使用multer即可,以你的分类创建接口为例:
在categoryRouter.js中添加如下配置:
const multer = require('multer') // 配置multer仅解析文本字段,不处理文件 const upload = multer() // 原路由添加upload.none()中间件 router.post('/category', upload.none(), exports.createCategory)
配置完成后即可正常通过req.body获取form-data提交的文本参数。
场景2:接口需要同时接收form-data文本字段和上传文件
可配置multer将上传的文件存储到你已声明的uploads静态目录,配置示例:
const multer = require('multer') const path = require('path') // 配置文件存储规则 const storage = multer.diskStorage({ // 文件存储路径,对应你项目的uploads目录 destination: function (req, file, cb) { cb(null, path.join(__dirname, '../uploads')) }, // 自定义存储的文件名,避免重名 filename: function (req, file, cb) { const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9) cb(null, file.fieldname + '-' + uniqueSuffix + path.extname(file.originalname)) } }) const upload = multer({ storage: storage }) // 示例:接收单张名为productImg的文件+其他文本字段 router.post('/product', upload.single('productImg'), exports.createProduct)
配置完成后,req.body可获取所有文本字段,req.file可获取上传的文件信息。
内容的提问来源于stack exchange,提问作者Omar Atef
相关产品推荐
相关产品推荐

