2014-11-12 1 views
1

я использую ниже код, чтобы получить данные из MongoDB ограничена коллекциейMongoDB Tailable Курсор в nodejs, как остановить поток

функции слушать (условия, обратный вызов) {

 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) 
     }); 

     }); 
    } 

, а затем я использую сокеты. вещания (roomName, 'данные', документ);

на стороне клиента

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

});

это прекрасно работает, так как я могу видеть любой новый документ, который вставлен в db.

Я могу видеть в mongod -verbose, что после каждых 200 мс существует запрос, выполняющийся с запросом {$ gt: latest_id}, и это прекрасно, но я понятия не имею, как я могу закрыть этот запрос :(Я очень новый в nodejs и используя MongoDB tailable опции в первый раз, и я полностью потерял, любая помощь или подсказка высоко ценится

ответ

3

Что возвращается из метода .stream() от объекта Cursor вернулся из .find() является реализацией интерфейса node transform stream. В частности, это «читаемый» поток.

Как таковое, это событие «данных» излучается всякий раз, когда появляются новые данные r доступный и доступный в потоке для чтения.

Существуют и другие методы, такие как .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() для преобразования. Потоки узлов - очень полезные и мощные вещи, которые стоило бы сблизиться с их использованием.

+0

Большое спасибо Нил :) Наконец, я могу остановить поток. Осталось только одно: событие данных потока только активируется, когда запись добавляется в коллекцию: (это означает, что если запись не добавляется в db, то у меня нет события, где я могу закрыть поток .. но вы ответили на мой вопрос о том, как остановить поток, так что спасибо снова – Arian

+0

@Arian. Ваша интерпретация здесь неверна. «Поток» - это просто объект, в котором определен слушатель событий. Прочтите еще раз и поймите «область видимости». в каком-либо другом месте, вы можете «приостановить» или просто отключить объект, чтобы ничего больше не происходило. –

+0

Я напишу шаги, как я проверяю 1. Я запускаю свой код 2. mongod is работающий с опцией vrebose, поэтому я могу видеть монодб-запрос, который я потоковал 3.Я снова обновил свой код и добавил функцию функция clearStream() { setTimeout (function() {stream.paused = true;}, 10000); }} Если я помещаю эту функцию внутри (событие data), это работает, но если я вызываю эту функцию просто снаружи ... код действительно выполняется, но ничего не происходит, и я могу видеть, что запрос все еще выполняется в консоли mongod: ( – Arian

Смежные вопросы