2016-04-13 36 views
0

注:我不相信这个问题is a duplicate of this similar question,因为它更具体。将来自MongoDB游标的对象流到nodejs HTTP响应

我试图用nodejs-mongodb-driver从Mongo中检索多个对象,并将对象作为JSON写入HTTP响应。这些对象应该是一个数组的形式,但我不想在光标上调用toArray(),因为这会占用内存,我尽可能避免调用大的JSON.stringify调用。

var response = ... // an http response 
collection.find().stream(JSON.stringify).pipe(response); // causes a malformed JSON string 

浏览器中的对象如下所示。

{"obj", "obj"}{"obj", "obj"} // clearly malformed 

有没有一种有效的方法来做到这一点?

回答

1

我将解释您编写的代码,以便了解为什么它会返回格式错误的JSON,以及为什么您可能需要toArray()或您发布的答案中的JSONStream库。

第一个collection.find()返回Cursor对象。那时没有数据被读取。然后,.stream(JSON.stringify)调用返回一个可读的Stream与转换函数JSON.stringify。仍然没有数据读取。

.pipe(response)调用然后读取整个Stream到最后,并为每个对象调用JSON.stringify函数。请注意,它确实会为每个单独的object单独调用它,因此不会创建array。相反,您会在object之后得到畸形的 JSON,object

现在您发布的问题中的答案尽可能重复(Stream from a mongodb cursor to Express response in node.js)适用于您,但它需要一个附加的库文件和JSONStream。 JSONStream正确处理CursorStreamJSON输出。我不知道这是否真的减少了开销,但你可以尝试。

没有额外的库文件,您将不得不使用toArray()

+0

我知道为什么它的格式不正确。我正在寻求一种有效的方式来做到这一点。如果有一个额外的图书馆,你为什么不建议一个。 – MatUtter

+0

您已在该问题的第一行中发布了该答案。而且我仍然认为阵列效率很高。你做过测试吗?图书馆是在你认为不是重复的问题的答案。 – x4rf41