我试图在没有第三方依赖的情况下执行此操作,因为我认为不需要它们。请注意,由于架构师的裁决,我们必须使用MongoDB本机,而不是Mongoose(不要问!)。
基本上我有一个getAll
函数,它将从单个集合中返回所有文档(基于传入的查询)。
文档的数量很容易达到几千个,因此,我希望在收到文档时将其流式传输出去。
我有以下代码:
db.collection('documents')
.find(query)
.stream({
transform: (result) => {
return JSON.stringify(new Document(result));
}
})
.pipe(res);
哪种类型的作品,除了会破坏文档应位于的数组并响应{...}{...}
必须有一种正确的方法吗?
答案 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);
);
请注意在生产中使用管道,管道不会在发生错误时销毁源流或目标流。为了避免内存泄漏,建议在生产中使用
pump
或pipeline
。