繁体   English   中英

在nodejs中Mongodb Tailable Cursor,如何停止流

[英]Mongodb Tailable Cursor in nodejs, how to stop stream

我使用下面的代码从mongodb capped集合中获取数据

函数listen(条件,回调){

        db.openConnectionsNew( [req.session.client_config.db] , function(err, conn){

            if(err) {console.log({err:err}); return next(err);}

            coll = db.opened[db_name].collection('messages');

        latestCursor = coll.find(conditions).sort({$natural: -1}).limit(1)
        latestCursor.nextObject(function(err, latest) {
            if (latest) {
                conditions._id = {$gt: latest._id}
            }
            options = {
                tailable: true,
                awaitdata: true,
                numberOfRetries: -1
            }
            stream = coll.find(conditions, options).sort({$natural: -1}).stream()
            stream.on('data', callback)
        });

        });
    }

然后我使用sockets.broadcast(roomName,'data',document);

在客户端

io.socket.get('/get_messages/', function(resp){
});
io.socket.on('data', function notificationReceivedFromServer ( data ) {
  console.log(data);

});

这非常有效,因为我能够看到插入db中的任何新文档。

我可以在mongod -verbose中看到,在每个200ms之后有查询运行查询{$ gt:latest_id},这很好,但我不知道如何关闭此查询:(我在nodejs和使用中非常新第一次mongodb tailable选项,我完全迷失了,任何帮助或线索都非常感谢

什么是从返回.stream()从方法光标对象从返回.find()是所述的一种实现节点变换流接口。 具体来说,这是一个“可读”的流。

因此,只要在要读取的流中接收到新数据并且可用,就会发出“数据”事件。

还有其他方法,如.pause().resume() ,可用于控制这些事件的流程。 通常,您将这些“内部”称为“数据”事件回调,您希望确保在处理“下一个”数据事件之前执行该回调中的代码:

stream.on("data", function(data) {
   // pause before processing
   stream.pause();

  // do some work, possibly with a callback
  something(function(err,result) {

      // Then resume when done
      stream.resume();
  });
});

但当然这只是“范围界定”的问题。 因此,只要在另一段代码可以访问它的范围内定义“stream”变量,就可以随时调用任一方法。

同样,通过相同的范围标记,您可以在代码中的任何位置“取消定义”“流”对象,使“事件处理”变得多余。

// Just overwrite the object
scope = undefined;

所以值得了解。 实际上,节点驱动程序的较新“版本2.x”将“流接口”直接包装到标准Cursor对象中,而无需调用.stream()进行转换。 节点流是非常有用和强大的东西,在与它们的使用达成协议时非常值得。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM