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

Node.js Express中PUT/PATCH请求form-data返回undefined或{}问题求助

Node.js中PUT/PATCH请求无法获取请求体,返回undefined或{}

我已经卡了两天,试遍各种解决方案,但在Node.js里用PUT和PATCH方法时,始终获取不到请求体,拿到的要么是undefined要么是{}。Postman请求截图如下:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:35:20