【问题标题】:Streaming JSON with oboe.js from gzipped resource从 gzipped 资源中使用 oboe.js 流式传输 JSON
【发布时间】: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


【解决方案1】:

由于第 4-5 行中的“包装器”,您似乎无法正确使用管道功能(如速度适应) 只需将其删除。

更多关于管道的信息node.js

【讨论】:

  • 感谢您提供的资源,我会跟进,看看能否找到解决方案。 “只是删除它”是什么意思 - 使用 gunzip.pipe(o) 不起作用(“未捕获的错误:dest.once 不是函数”),但需要以某种方式将数据从 gunzip 传输到双簧管。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 2022-01-21
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 2012-09-09
  • 2021-07-17
相关资源
最近更新 更多