如何将数据连续放入流中并在节点js中压缩数据时进行传输

时间:2014-02-28 15:46:16

标签: node.js express zlib real-time-data

我是javascript的新手。

我要做的是从数据库中获取数据,然后在互联网上传输。

现在我一次只能读一个条目,但我想一起压缩所有条目,而不是一次压缩一个条目。

我可以将它们全部存储在一个数组中,然后将这个数组传递给zlib函数。但这占用了大量的时间和记忆。

以某种方式可以压缩数据,同时在读取的同时使用express api在节点js中传输数据,有点像流式服务器,实时压缩数据同时从内存中检索数据然后传输它到客户端

2 个答案:

答案 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响应。

参考:http://nodejs.org/api/stream.html

参考:http://nodejs.org/api/zlib.html