Postman中form-data传参req.body为undefined,raw JSON正常的问题
问题原因与解决方案
是的,你缺少处理multipart/form-data格式请求的中间件配置。body-parser以及Express内置的express.urlencoded都不支持解析form-data类型的请求,这就是用该格式发送请求时req.body返回undefined的核心原因。
解决步骤:
- 安装专门处理
multipart/form-data的中间件multer:
npm install multer
- 配置并应用
multer中间件:
由于你当前仅需处理普通文本字段(无文件上传),可以使用multer().none()配置,该配置会解析form-data中的所有文本字段并挂载到req.body上。
方式一:全局路由级配置(修改app.js)
const express = require('express'); const app = express(); const hostname = '127.0.0.1'; const port = 3000; const path = require('path'); const multer = require('multer'); // 配置multer仅处理文本字段 const upload = multer().none(); // 移除冗余的body-parser依赖配置(Express 4.16+已内置对应功能) app.use(express.json()); app.use(express.urlencoded({ extended: true })); // 给/products路由应用multer中间件 app.use('/products', upload, require('./Routes/products.js')); app.set("view engine", "ejs"); app.listen(port, () => { console.log(`Listening to http://${hostname}:${port}`); }); module.exports = app;
方式二:单个路由配置(修改product.js)
const express = require('express'); const router = express.Router(); const path = require('path'); const Product = require('../Models/product.js'); const multer = require('multer'); // 配置multer仅处理文本字段 const upload = multer().none(); // Post router.post('/', upload, async (req, res) => { console.log('req.b: ', req.body); const product = new Product ({ name: req.body.name, theme: req.body.theme, price: req.body.price, size: req.body.size, amount: req.body.amount }); try { const savedProduct = await product.save(); res.json(savedProduct); }catch (err) { res.json({ message:err }) } })
配置完成后,再用Postman以form-data格式发送请求,就能正常获取req.body中的数据了。如果后续需要处理文件上传,只需调整multer的存储配置即可。
内容的提问来源于stack exchange,提问作者Lim Jing Png
相关产品推荐
相关产品推荐

