我正在研究基于节点/快递(Sails,技术上)的服务,该服务将用于检索大量项目。几个调用需要返回数千个项目作为JSON序列化数组。
内部节点将是一个基本的控制循环,用于检索页面中的项目。将检索每个页面,执行一些小的处理,然后将其项目返回给客户端。
目前我正在进行“存储转发”方法,其中每个页面的项目都是throw
到concat()
数组,然后一旦检索完所有项目,就会返回结果。
我想做的更多的是收益或流媒体方法,其中项目一旦准备就被添加到响应中 - 避免构建大型内存中集合并开始发送尽快使用可用数据。
答案 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