【发布时间】:2019-01-22 15:02:20
【问题描述】:
我将一些 json 数据作为 gzip 压缩文件存储在服务器上(为了减少传输的数据量,同时也减少服务器上的磁盘使用量)。
现在,我想在客户端(运行react/node的浏览器)解压解析json数据。
我认为,使用oboe.js 可能是完成此任务的合适选择。不幸的是,在浏览器中工作时直接传递双簧管流似乎是不可能的。 我依赖的解决方案是在解压缩后将大块数据提供给双簧管(参见本文底部的代码)。
虽然这确实有效,但如果节点侦听器需要一些时间来处理节点,它会冻结浏览器一段时间(当然,解析数据需要一些时间,但我希望应用程序保持响应并可能甚至根据已经处理的数据更新视图)。
我怀疑所有数据基本上都是一次性输入双簧管,而不是等到最后一个块被读取。这个对吗?是否有适当的方法来减慢提供给双簧管的数据量,或者是否有更直接的方法来使用 gzip 流和双簧管?
var o = oboe();
var gunzip = zlib.createGunzip();
gunzip.on('data', (chunk) => o.emit('data', chunk.toString()))
.on('end', o.emit('end'));
request(options).on('response', response => {
o.emit('start', response.statusCode, response.headers);
response.pipe(gunzip);
};
o.node('{name}', () => {
//Do stuff with node
return oboe.drop;
});
【问题讨论】:
-
似乎,当一个流被传递给双簧管时,一旦它可用,数据就会被馈送到双簧管。这个决定可能是基于这样的假设,即节点事件的处理速度比进入流的数据要快。
标签: javascript node.js node-streams oboe.js