如何从节点流式传输JSON?

时间:2015-10-22 14:50:39

标签: json node.js express streaming sails.js

我正在研究基于节点/快递(Sails,技术上)的服务,该服务将用于检索大量项目。几个调用需要返回数千个项目作为JSON序列化数组。

内部节点将是一个基本的控制循环,用于检索页面中的项目。将检索每个页面,执行一些小的处理,然后将其项目返回给客户端。

目前我正在进行“存储转发”方法,其中每个页面的项目都是throwconcat()数组,然后一旦检索完所有项目,就会返回结果。

我想做的更多的是收益或流媒体方法,其中项目一旦准备就被添加到响应中 - 避免构建大型内存中集合并开始发送尽快使用可用数据。

2 个答案:

答案 0 :(得分:2)

如果你需要从你的所有数据中生成一个大的JSON字符串,那么你几乎将所有内容存储在内存中,然后JSON.stringify - 它。

另一种方法是将每个项目作为单独的JSON字符串,使用换行符作为分隔符。这样,只要您处理了一个项目,就可以使用节点流对其进行字符串化并将其传递给您的响应,并且在客户端中您也可以逐行处理您收到的数据。它会是这样的:

// For each page of data you get, loop over the items like you say
for item in dataset // Yes that's Coffeescript

  // Manipulate the item as you need, then make a JSON string out of it
  jsonStr = JSON.stringify(item) + '\n'

  // Pipe the string to your http response
  jsonStr.toStream().pipe(res) // Assuming 'res' is the Express response object

这不是解决问题的唯一方法,但特别是如果您想使用JSON,它是最简单的实现之一。我对Sails没有任何经验,但我想基本的实现方式是一样的。

我希望我的回答可以帮助你,如果不随意发表评论。

注意:.toStream()方法来自我的模块streammagic,但当然还有其他方法可以从字符串中生成流。

答案 1 :(得分:1)

您可以使用类似的内容直接写入快递中的 res 对象

-h