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

Express.js解析request body异常:curl纯文本body被转为对象如何解决?

问题原因
  • curl使用-d参数发送请求时,默认会自动添加Content-Type: application/x-www-form-urlencoded请求头,该格式要求请求体为key=value结构的键值对。
  • 你当前服务端仅配置了express.json()(仅解析JSON格式请求体)和express.urlencoded()(仅解析urlencoded格式的键值对)两个内置解析中间件:你传入的it is body没有=分隔符,urlencoded中间件会将整个字符串识别为键名,对应值设为空字符串,最终解析出的req.body就是你实际收到的{"it is body":""}结构。
  • 你需要直接获取原始字符串请求体的需求,是json和urlencoded中间件都不支持的,所以需要额外配置解析规则。
解决方案

推荐修改服务端支持纯文本请求体解析,操作步骤如下:

  1. 在路由注册前添加express内置的纯文本解析中间件express.text(),该中间件会自动将Content-Type: text/plain的请求体解析为字符串挂载到req.body上。
  2. 发送请求时添加Content-Type: text/plain请求头,明确指定请求体格式为纯文本。

修改后的服务端完整代码:

const express = require('express')
const cors = require('cors')
const app = express()
const PORT = process.env.PORT || 3000;

app.use(cors())

// 新增纯文本解析中间件
app.use(express.text())
app.use(express.json())
app.use(express.urlencoded({ extended: true }))

app.all('/hello/', function (req, res, next) {
  res.json({
    'message': 'test',
    'x-result': req.headers['x-test'],
    'x-body': req.body
  })
})

app.listen(PORT, function () {
  console.log('CORS-enabled web server listening on port 3000')
})

修改后的curl请求命令:

curl 'http://127.0.0.1:3000/hello/' -d 'it is body' -H 'x-test: test' -H 'Content-Type: text/plain'

修改后即可得到你期望的返回结果:

{ "message":"test", "x-result":"test", "x-body":"it is body" }

如果你不想修改服务端代码,也可以直接调整curl请求符合urlencoded格式,将请求体改为data=it is body,同时修改路由中取值逻辑为req.body.data,也可得到相同的结果。

内容的提问来源于stack exchange,提问作者aaltw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:09:03