我是javascript的新手。
我要做的是从数据库中获取数据,然后在互联网上传输。
现在我一次只能读一个条目,但我想一起压缩所有条目,而不是一次压缩一个条目。
我可以将它们全部存储在一个数组中,然后将这个数组传递给zlib函数。但这占用了大量的时间和记忆。
以某种方式可以压缩数据,同时在读取的同时使用express api在节点js中传输数据,有点像流式服务器,实时压缩数据同时从内存中检索数据然后传输它到客户端
答案 0 :(得分:1)
这当然是可能的。您可以使用此示例:
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调用替换为实际的数据库调用。但这个想法保持不变。
答案 1 :(得分:0)
我建议使用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响应。