簡體   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