如何在Node.js HTTP2中获取请求体?附代码求助
获取Node.js HTTP2服务端的请求体
嘿,我看你这段HTTP2服务端代码里想获取请求体,但找错方式啦!Node.js的http2模块中,stream事件的回调函数并没有直接提供body参数——你原代码里写的第三个参数是无效的,这就是你拿不到请求体的原因。
要正确获取请求体,你需要通过监听流的data和end事件来逐步收集请求数据,就像处理传统HTTP请求流那样。下面是修改后的完整代码,我加上了详细注释:
var http2 = require('http2'); var fs = require('fs'); var server = http2.createSecureServer({ key: fs.readFileSync('localhost-privkey.pem'), cert: fs.readFileSync('localhost-cert.pem') }); server.on('error', function (error) { console.error(error); }); server.on('stream', function (stream, headers) { var method = headers[':method']; var path = headers[':path']; // 初始化数组收集数据块(数组拼接比字符串更高效) var bodyChunks = []; // 每次收到请求数据块时存入数组 stream.on('data', function(chunk) { bodyChunks.push(chunk); }); // 请求体数据全部接收完成时触发 stream.on('end', function() { // 拼接所有数据块并转成字符串(二进制场景可跳过转字符串) var body = Buffer.concat(bodyChunks).toString('utf8'); console.log(method, path, body); // 补充原代码中未定义的变量,你可根据业务调整 var contentType = 'html'; var targetFile = 'index.html'; stream.respond({ 'content-type': `text/${contentType}`, ':status': 200 }); fs.readFile(targetFile, function (error, fileData) { if (error) { // 读取失败时返回错误页面 fileData = fs.readFileSync('error.html'); } stream.end(fileData); }); }); // 监听流错误,避免服务因单一流崩溃 stream.on('error', function(err) { console.error('Stream error:', err); stream.respond({ ':status': 500 }); stream.end('Internal Server Error'); }); }); server.listen(3443);
额外提示:
- 如果请求体是JSON格式,可在
end事件里用JSON.parse(body)解析,但记得加try/catch处理解析失败的情况。 - 处理大文件上传时,别把整个请求体存进内存,直接把流
pipe到文件或其他处理流里,避免内存溢出。 - 原代码里的
type和file变量未定义,我加了占位符,你需要根据实际业务逻辑补充完整。
内容的提问来源于stack exchange,提问作者Costa Michailidis
相关产品推荐
相关产品推荐

