【发布时间】:2026-01-11 20:25:02
【问题描述】:
我正在使用 ExpressJS 构建一个 NodeJS 服务器,用于处理从桌面应用通过 POST 请求 发送的数据(50KB 到 >100MB)待处理并退回。桌面应用 gzip 在发送前压缩数据(50KB 变为 4KB)。
我希望服务器解压缩数据,从数据中提取值(字符串、整数、字符、数组、json 等),处理该数据,然后用处理后的数据进行响应。
我是从这个开始的:
apiRoute.route("/convert").post(bodyParser.raw({limit: '100Mb'}), (req, res) =>{
let outputData;
//extract values from req.body Buffer and do math on them.
//save processed data in outputData
res.json({
status: true,
data: outputData
});
});
之所以有效,是因为 body-parser 将数据解压缩到存储在内存中的 Buffer req.body 中。这是我的主要问题......内存使用情况。我不想将整个数据集存储在内存中。
为了解决这个问题,我删除了 body-parser,而是将请求流直接通过管道传输到 zlib 转换流中:
apiRoute.route("/convert").post((req, res) =>{
req.pipe(zlib.createGunzip());
});
现在的问题是我不知道如何从流中提取二进制值。
这是我希望能够做到的:
apiRoute.route("/convert").post((req, res) =>{
let binaryStream = new stream.Transform();
req
.pipe(zlib.createGunzip())
.pipe(binaryStream);
let aValue = binaryStream.getBytes(20);//returns 20 bytes
let bValue = binaryStream.getBytes(20000);//returns the next 20000 bytes
//etc...
});
但是我不知道有什么方法可以做到这一点。 Dissolve 之类的模块很接近,但是它们需要您提前设置解析逻辑,并且所有抓取的值都存储在内存中。
另外,如果不将 outputData 全部加载到内存中,我不知道如何响应。
所以我的问题是,我该如何...
- 以我自己的异步速率从流中读取数据并提取其中的值
- 将处理后的数据发送回桌面应用程序,而不将其全部放入内存中
【问题讨论】:
标签: node.js express asynchronous stream gzip