я использую ниже код, чтобы получить данные из 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 опции в первый раз, и я полностью потерял, любая помощь или подсказка высоко ценится
Большое спасибо Нил :) Наконец, я могу остановить поток. Осталось только одно: событие данных потока только активируется, когда запись добавляется в коллекцию: (это означает, что если запись не добавляется в db, то у меня нет события, где я могу закрыть поток .. но вы ответили на мой вопрос о том, как остановить поток, так что спасибо снова – Arian
@Arian. Ваша интерпретация здесь неверна. «Поток» - это просто объект, в котором определен слушатель событий. Прочтите еще раз и поймите «область видимости». в каком-либо другом месте, вы можете «приостановить» или просто отключить объект, чтобы ничего больше не происходило. –
Я напишу шаги, как я проверяю 1. Я запускаю свой код 2. mongod is работающий с опцией vrebose, поэтому я могу видеть монодб-запрос, который я потоковал 3.Я снова обновил свой код и добавил функцию функция clearStream() { setTimeout (function() {stream.paused = true;}, 10000); }} Если я помещаю эту функцию внутри (событие data), это работает, но если я вызываю эту функцию просто снаружи ... код действительно выполняется, но ничего не происходит, и я могу видеть, что запрос все еще выполняется в консоли mongod: ( – Arian