一尘不染

从mongodb游标流式传输到node.js中的Express响应

node.js

我正在玩弄所有花哨的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);

     }
  });
});

您可能已经猜到了,对Mongodb catalog.byTag(tag, callback)进行find()查询并返回游标

这会导致错误:

TypeError: first argument must be a string or Buffer

根据mongodb驱动程序doc,我试图将此转换器传递给stream()

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

但这无济于事。

谁能告诉我如何正确地将某些内容发送给响应?

还是唯一的解决方案是使用’data’和’end’事件手动抽取数据的样板?


阅读 272

收藏
2020-07-07

共1个答案

一尘不染

这里的其他答案的工作组合

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 stream3兼容的流,并且该流优先于不推荐使用的query.stream()接口。
  • 通过管道JSONStream.stringify()将文档组合成数组而不是单个对象
  • res.type('json')将HTTP Content-Type标头设置为的管道application/json并再次返回自身(响应流)。
2020-07-07