我在玩弄所有花哨的 node .js/mongodb/express平台,偶然发现了一个问题:

app.get('/tag/:tag', function(req, res){
  var tag=req.params.tag;
  console.log('got tag ' + tag + '.');
  catalog.byTag(tag,function(err,cursor) {
     if(err) {
       console.dir(err);
       res.end(err);
     } else {
       res.writeHead(200, { 'Content-Type': 'application/json'});

       //this crashes
       cursor.stream().pipe(res);

     }
  });
});

正如您可能猜到的,catalog.byTag(tag, callback)对Mongodb执行find()查询并返回游标

这会导致一个错误:

TypeError: first argument must be a string or Buffer

根据mongodb driver doc

function(obj) {return JSON.stringify(obj);}

但这没有帮助.

有谁能告诉我如何正确地将内容流式传输到响应中吗?

或者,唯一的解决方案是使用"数据"和"结束"事件手动泵送数据的样板文件吗?

推荐答案

这里是其他答案的有效组合

app.get('/comments', (req, res) => {
  Comment.find()
    .cursor()
    .pipe(JSONStream.stringify())
    .pipe(res.type('json'))
})

http://mongoosejs.com/docs/api.html#query_Query-cursor

  • cursor()返回与Node streams3兼容的流,与不推荐使用的query.stream()接口相比,它更受欢迎.
  • 管道到JSONStream.stringify(),以将文档合并到一个数组中,而不是单个对象
  • 管道设置为res.type('json'),将HTTP Content-Type头设置为application/json,并再次返回自身(响应流).

Mongodb相关问答推荐

MongoDB(Mongoose)条件判断没有像我预期的那样工作

无法从我的NextJS 14应用程序中的Redux工具包2.0中提取数据

字段$set聚合导致错误美元($)前缀字段$concatArrays对于存储无效"

MongoDB 投影按数组中的字符串长度排序

尽管前一阶段输出文档,$group stage 仍返回零文档

分组前的 MongoDb 聚合总数

如何在 mongodb 本机驱动程序中对 find() 进行字段 Select ?

将数据插入 MongoDB - 没有错误,没有插入

Django admin 和 MongoDB,可能吗?

插入违反唯一索引的 MongoDB 文档时如何捕获错误?

如何在 Rails 中混合使用 mongodb 和传统数据库?

mongodb 的计数性能

获取 mongodb 中所有唯一标签的列表

mongoose:按字母顺序排序

Mongodb $lookup 使用 _id 无效果

MongoDB $elemMatch $in

如何通过mongoose更新 mongodb 中的对象?

通过浏览器连接mongodb?

MongoTemplate upsert - 从 pojo 进行更新的简单方法(哪个用户已编辑)?

spring 数据MongoDB.生成id的错误