将对象从MongoDB游标流式传输到nodejs HTTP响应

时间:2016-04-13 17:33:01

标签: json node.js mongodb httpresponse

注意:我不相信这个问题is a duplicate of this similar question,因为它更具体。

我正在尝试使用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 个答案:

答案 0 :(得分: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正确处理CursorStream JSON输出。我不知道这是否真的减少了开销,但你可以试试。

如果没有添加图书馆,则必须使用toArray()