将MongoDB结果流式传输到Express响应

时间:2018-12-19 10:54:49

标签: node.js mongodb express

我试图在没有第三方依赖的情况下执行此操作,因为我认为不需要它们。请注意,由于架构师的裁决,我们必须使用MongoDB本机,而不是Mongoose(不要问!)。

基本上我有一个getAll函数,它将从单个集合中返回所有文档(基于传入的查询)。

文档的数量很容易达到几千个,因此,我希望在收到文档时将其流式传输出去。

我有以下代码:

db.collection('documents')
    .find(query)
    .stream({
        transform: (result) => {
            return JSON.stringify(new Document(result));
        }
    })
    .pipe(res);

哪种类型的作品,除了会破坏文档应位于的数组并响应{...}{...}

必须有一种正确的方法吗?

1 个答案:

答案 0 :(得分:0)

您可以做的是在请求数据库之前明确地写出数组res.write("[")的开始,在每个json字符串化对象上放置,,并在流的末尾写出数组的末尾res.write("]")可以正常工作。 但这是不可取的!

  

JSON.stringify是一个非常慢的操作,您应尽量减少使用它。

更好的方法是使用可流式的JSON.stringify实现,例如json-stream-stringify

const JsonStreamStringify = require('json-stream-stringify');
app.get('/api/users', (req, res, next) => {
   const stream = db.collection('documents').find().stream();
   new JsonStreamStringify(stream).pipe(res);
);
  

请注意在生产中使用管道,管道不会在发生错误时销毁源流或目标流。为了避免内存泄漏,建议在生产中使用pumppipeline