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中间件都不支持的,所以需要额外配置解析规则。
解决方案
推荐修改服务端支持纯文本请求体解析,操作步骤如下:
- 在路由注册前添加express内置的纯文本解析中间件
express.text(),该中间件会自动将Content-Type: text/plain的请求体解析为字符串挂载到req.body上。 - 发送请求时添加
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
相关产品推荐
相关产品推荐

