Node.js 中 http 模块的 req 是 ReadableStream,请求行(req.method、req.url、req.httpVersion)直接可用,请求头在 req.headers(小写键名),请求体需手动监听 data/end 事件读取流并解析。

在 Node.js 环境中,原生 http 模块接收到的请求(req)是一个 ReadableStream 实例,它本身不直接提供解析后的请求行、请求头和请求体。你需要手动解析或借助中间件/工具模块来提取这些信息。
获取请求行(Method、URL、HTTP Version)
请求行信息在 req 对象上是**直接可用**的,无需额外解析:
-
请求方法:
req.method(如'GET'、'POST') -
原始 URL(含查询参数):
req.url(如'/api/user?id=123') -
HTTP 版本:
req.httpVersion(如'1.1'或'2.0') -
解析后的路径与查询对象:可配合
url.parse(req.url, true)或new URL(req.url, 'http://localhost')获取结构化数据
获取请求头(Headers)
请求头以对象形式挂载在 req.headers 上,所有键名自动转为小写(如 'content-type'),值为字符串或字符串数组(当头字段重复时):
-
req.headers['content-type']→'application/json' -
req.headers['user-agent']→'Mozilla/5.0 ...' - 注意:
req.headers是只读对象,修改不会影响实际传输
获取请求体(Body)
请求体需手动读取流并拼接,因为 req 默认不缓存数据。常见做法如下:
- 监听
'data'和'end'事件,累加Buffer或字符串 - 对
JSON请求,通常先用Buffer.concat(chunks)合并后JSON.parse() - 对表单数据(
application/x-www-form-urlencoded),可用querystring.parse()解析 - 对文件上传(
multipart/form-data),需用专用库如busboy或formidable
示例(简易 JSON body 解析):
let body = [];
req.on('data', chunk => body.push(chunk));
req.on('end', () => {
const data = Buffer.concat(body).toString();
try {
const json = JSON.parse(data);
console.log('Parsed body:', json);
} catch (e) {
console.error('Invalid JSON');
}
});
推荐模块辅助解析
避免重复造轮子,可使用成熟模块统一处理:
-
body-parser(Express 内置或独立使用):支持json、urlencoded、text等格式,自动挂载req.body -
raw-body:轻量级,专注读取原始 body Buffer,适合自定义解析逻辑 -
busboy:高性能流式解析 multipart,适合大文件上传场景
不复杂但容易忽略:务必设置 req.setEncoding('utf8')(若按字符串处理)或保持 Buffer 模式,避免乱码或截断。










