Javascript Express.js:来自Mongo的流结果并以非阻塞方式序列化

Javascript Express.js:来自Mongo的流结果并以非阻塞方式序列化,javascript,node.js,mongodb,express,generator,Javascript,Node.js,Mongodb,Express,Generator,我想做的是,更新不依赖于,不再维护。我们有: Comment.find() .cursor() .pipe(JSONStream.stringify()) .pipe(res.type('json')) 它使用的是Mongoose.cursor(),返回一个,但我愿意使用本机mongo驱动程序 现在,我的第一个问题是:是否有人还在使用Node.js流,或者您现在应该使用JavaScript迭代器和生成器 如果是这样的话,我想我可以将每个块分别转换为JSON。(尽管库中建议进行错误处理等操作是受

我想做的是,更新不依赖于,不再维护。我们有:

Comment.find()
.cursor()
.pipe(JSONStream.stringify())
.pipe(res.type('json'))
它使用的是Mongoose
.cursor()
,返回一个,但我愿意使用本机mongo驱动程序

现在,我的第一个问题是:是否有人还在使用Node.js流,或者您现在应该使用JavaScript迭代器和生成器

如果是这样的话,我想我可以将每个块分别转换为JSON。(尽管库中建议进行错误处理等操作是受欢迎的,即使这不是本文的主题,也不是问题的核心)

但是如何将迭代器流转换为express.js结果呢

我找不到任何关于这方面的文档(尽管也找不到关于
res
是一个可写流的文档,尽管它可以工作。)我在这里的想法是否正确

编辑:

同时,我做了更多的研究,发现了以下LIB:

  • –没有打字脚本,但有JSONStream的创建者作为贡献者
  • –与
  • –看起来很有趣。。。也许有点过分,但至少为它们的流提供了
    map
    filter
    等实现

编辑:添加了自定义架线步骤

ExpressJS中的
res
对象是一个可写的子类,可以通过管道传输数据

我倾向于使用NodeJS的内置支持将迭代器转换为可读的迭代器,并使用
stream.pipeline
进行异常处理来连接这个数据流

请注意,不再需要在NodeJS v13+中将光标转换为可读的,因为stream.pipeline现在接受异步迭代器而不是流

请注意,如果可以直接使用Mongoose的,则使用
stringify()
是多余的。Lean将发出JSON数据

从“流”导入流;
从“util”导入util;
函数处理程序(req、res、next){
试一试{
//初始化光标
const cursor=Comment.find().lean();/“lean”将发出json数据
const readable=stream.readable.from(游标);
//对管道的承诺将使其出现错误
wait util.promisify(stream.pipeline)(可读,res.type('json');
next();
}
捕获(错误){
下一步(错误);
}
}
在NodeJS v13+中使用自定义串接:


从“流”导入流;
从“util”导入util;
函数处理程序(req、res、next){
试一试{
//初始化光标
const cursor=Comment.find().lean();/“lean”将发出json数据
const readable=stream.readable.from(游标);
//对管道的承诺将使其出现错误
wait util.promisify(stream.pipeline)(
可读,
//使用异步迭代器自定义“字符串化”
异步函数*(源){
//在mongodb的结果之前添加一些输出
//REST API中的结果数。
“附加”产量
等待(来源的常量注释){
//发出从MongoDB检索的数据的“投影”
屈服{
text:comment.text,
//添加新属性:
newProperty:对
}
}
//向响应中添加一些最终数据。在REST API中,这可能是数组“]”的右括号。
收益率“预先约定”
},
//然后,字符串化数据通过管道传输到表示“res”对象
res.type('json')
);
next();
}
捕获(错误){
下一步(错误);
}
}

非常感谢,很高兴听到最新的声音!因此,在实践中,我们稍微修改了js中的对象,因此我们不能使用
.lean()
调用,还需要
stringify
函数,您知道吗?此外,我们很快检查了mongo本地驱动程序,它似乎比mongoose性能更好?!但是需要更多的基准测试。。。(我还对问题进行了编辑)就我个人而言,我倾向于将mongoose用于查询和插入等轻量级API。然而,对于重载抓取(10GB+)来说,本机库的游标似乎使用更少的内存。我们使用mongodb同时进行主动查询和作为数据湖。在我们成功编写新版本之前,超燃冲压发动机不会有JSONStream的功能。我会看看JSONStream并尝试与他们联系——也许我们会接管它来支持它。