Node.js Express中PUT/PATCH请求form-data返回undefined或{}问题求助
Node.js中PUT/PATCH请求无法获取请求体,返回undefined或{}
我已经卡了两天,试遍各种解决方案,但在Node.js里用PUT和PATCH方法时,始终获取不到请求体,拿到的要么是undefined要么是{}。Postman请求截图如下:
相关代码
index.js
const express = require("express") const cors = require("cors") const bodyParser = require("body-parser") require("./db/db.config") const app = express() app.use(bodyParser.json()) app.use(bodyParser.urlencoded({ extended: true })) const PORT = 8000 const Customer = require("./routes/customerRoutes") app.use(cors()) app.use(Customer) app.listen(PORT, () => { console.log("Server is running on", PORT) })
package.json 依赖
"dependencies": { "body-parser": "^1.20.1", "cors": "^2.8.5", "express": "^4.18.2", "moment": "^2.29.4", "mongoose": "^6.9.2", "multer": "*", "validator": "^13.9.0" },
解决方法
1. 先检查Postman的请求配置
这是最常见的问题:
- 发送请求时,请求体选
raw->JSON格式 - 确认请求头里的
Content-Type是application/json - 检查请求体的JSON语法是否正确,有没有漏逗号、引号不匹配的情况
2. 调整中间件顺序&替换解析器
把cors移到最前面,同时可以用Express内置的解析器替代body-parser(Express 4.16+已内置相关功能,无需额外依赖):
const app = express() // 先处理跨域 app.use(cors()) // 用Express内置解析器替换body-parser app.use(express.json()) app.use(express.urlencoded({ extended: true })) const PORT = 8000 const Customer = require("./routes/customerRoutes") app.use(Customer)
3. 检查路由文件的处理逻辑
打开customerRoutes.js,先在PUT/PATCH路由里打印请求体确认:
router.put('/customers/:id', (req, res) => { console.log('请求体:', req.body) // 后续业务逻辑 })
如果路由里用了multer处理文件,注意仅给需要上传文件的路由挂载multer中间件,不要全局挂载,否则普通JSON请求会被拦截导致无法解析。
4. 排查multer的影响
你依赖里用了multer: "*",如果全局挂载了multer(比如app.use(upload.any())),会导致multer优先处理请求,没有文件的PUT/PATCH请求就无法解析JSON体。这种情况要把multer中间件只加在需要处理文件的路由上,其他路由保持默认解析。
内容的提问来源于stack exchange,提问作者Nayan Bhakhar
相关产品推荐
相关产品推荐

