当前位置: 首页 > 面试题库 >

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

姬经义
2023-03-14
问题内容

我正在玩弄所有花哨的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’事件手动抽取数据的样板?


问题答案:

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

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并再次返回自身(响应流)。


 类似资料:
  • 问题内容: 我有一种情况,我需要从Node.js / Express RESTful API返回一个很大的对象,并将其转换为JSON字符串。 但是,这似乎无法很好地扩展。具体来说,它在连接1-2个客户端的测试机上运行良好,但我怀疑当许多客户端同时请求大型JSON对象时,此操作可能会浪费CPU和内存使用率。 我四处寻找一个异步JSON库,但是我发现的唯一一个库似乎有问题(特别是,我收到了[Range

  • 问题内容: 我一直在使用Node.js中的二进制流进行实验,但令我惊讶的是,确实有一个工作演示,它使用节点无线电流获取Shoutcast流,并使用分块编码将其推入HTML5元素。但这仅适用于Safari! 这是我的服务器代码: 我的客户代码很简单: 这在Mac上的Safari 5中可以正常运行,但在Chrome或Firefox中似乎无法执行任何操作。有任何想法吗? 可能的候选对象包括编码问题,或者

  • 我正在尝试编写同时使用gRPC和REST的服务。实现技术有Java、Spring-Boot和gRPC。使用场景示例如下: 目的是有外部客户端可以通过RESTendpoint和/或通过进行gRPC调用与应用程序交互。在内部,有“网关”服务提供外部接口,并负责在外部客户端和执行实际工作的“域”服务之间传输/路由请求和响应。内部服务将通过gRPC进行通信。 外部客户端不知道如何在内部处理事情,域服务没有

  • 问题内容: 我产生了以下孩子:我希望在客户端( 浏览器 )上 一个接一个地 而不是整体接收ping结果。 到目前为止,我已经尝试过了: 然后: 在这两种情况下,浏览器都将等待10次ping操作,然后将结果整体打印出来。我想让他们一个接一个,如何实现呢? (客户只是在拨打电话并用console.log记录结果) 编辑: 尽管我确实相信websockets是实现这一点所必需的,但我只是想知道是否还有其

  • 问题内容: 我需要连续运行两个命令,这些命令需要从同一流中读取数据。将流传输到另一个流之后,缓冲区将被清空,因此我无法再次从该流读取数据,因此无法正常工作: 要求 对此抱怨 和改变 的inputStream 到收益率,当然同样的问题。我不想写入文件,而是以某种方式 重用 请求 产生的流(或与此相关的任何其他流)。 一旦可读流完成管道传输,是否可以重用?完成上述示例的最佳方法是什么? 问题答案: 您

  • 问题内容: 我在Node.js中使用流服务器来流MP3文件。虽然可以流式传输整个文件,但我不能使用标题将文件流式传输到起始位置并使用终止位置。 我使用like 从秒计算开始和结束字节 在这种情况下,这将为我提供从10秒到下一个第一个数据包的确切字节。 这在Node.js中变得如此简单 现在我有了开始和结束字节,我的媒体服务器将以这种方式从传递给它的自定义值中获取范围 此时,我将获得这个范围, 因此