我是 javascript 的新手。
我想做的是从数据库中获取数据,然后在互联网上传输。
现在我一次只能读取一个条目,但我想将所有条目压缩在一起,而不是一次压缩一个条目。
我可以将它们全部存储在一个数组中,然后将该数组传递给 zlib 函数。但这会占用大量时间和内存。
是否有可能在读取数据的同时使用 express api 在节点 js 中传输数据时压缩数据,有点像流服务器,实时压缩数据,同时从内存中检索数据,然后将其传输到客户端
我是 javascript 的新手。
我想做的是从数据库中获取数据,然后在互联网上传输。
现在我一次只能读取一个条目,但我想将所有条目压缩在一起,而不是一次压缩一个条目。
我可以将它们全部存储在一个数组中,然后将该数组传递给 zlib 函数。但这会占用大量时间和内存。
是否有可能在读取数据的同时使用 express api 在节点 js 中传输数据时压缩数据,有点像流服务器,实时压缩数据,同时从内存中检索数据,然后将其传输到客户端
这当然是可能的。你可以玩这个例子:
var express = require('express')
, app = express()
, zlib = require('zlib')
app.get('/*', function(req, res) {
res.status(200)
var stream = zlib.createGzip()
stream.pipe(res)
var count = 0
stream.write('[')
;(function fetch_entry() {
if (count > 10) return stream.end(']')
stream.write((count ? ',' : '') + JSON.stringify({
_id: count,
some_random_garbage: Math.random(),
}))
count++
setTimeout(fetch_entry, 100)
})()
})
app.listen(1337)
console.log('run `curl http://localhost:1337/ | zcat` to see the output')
我假设您正在流式传输 JSON,当然 setTimeout 调用需要替换为实际的数据库调用。但这个想法保持不变。
我建议使用 node.js 的pipe
.
这是使用 zlib(压缩)进行管道流式传输的示例:它读取文件,压缩文件并将其写入新文件。
var gzip = zlib.createGzip();
var fs = require('fs');
var inp = fs.createReadStream('input.txt');
var out = fs.createWriteStream('input.txt.gz');
inp.pipe(gzip).pipe(out);
您可以将输入更改为来自您的数据库输入,并将输出更改为 HTTP 响应。