注意:我不相信这个问题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


有有效的方法吗?

最佳答案

我将解释您编写的代码,以使您理解为什么它返回格式错误的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()

关于json - 将对象从MongoDB游标流式传输到NodeJS HTTP响应,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36605615/

10-11 09:18
查看更多