MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Обработка на изчаквания с Node.js и mongodb

UPD:
Въз основа на тази публикация изглежда, че са разположили корекция, която ще направи същото като това, което правим тук. Не съм сигурен дали това вече е в рамките на npm (15.10.13). https://github.com/mongodb/node -mongodb-native/issues/1092#ref-commit-2667d13

След известно разследване успях да разбера какво се случва там:
Всеки път, когато извикате който и да е метод за работа с база данни (намиране, актуализиране, вмъкване и т.н.), той създава курсор, който има собствен идентификатор и се регистрира към EventEmitter на Db за обратно извикване по-късно. Междувременно той се регистрира към обект _notReplied в същия CallBackStore.

Но след като връзката е затворена, не можах да намеря нищо, което да преминава през _notReplied курсорите и да ги задейства с грешки или някаква логика с таймери (все още може да е някъде там). Така че успях да напиша малка работа, която принудително задейства курсори с грешка, когато DB излъчва close събитие:

new mongodb.Db('testdb', new mongodb.Server('localhost', 27017, { }), { safe: true }).open(function (err, db) {
  if (!err) {
    db.on('close', function() {
      if (this._callBackStore) {
        for(var key in this._callBackStore._notReplied) {
          this._callHandler(key, null, 'Connection Closed!');
        }
      }
    });

    // ...

  } else {
    console.log(err)
  }
});

Препоръчвам да използвате първия подход вместо MongoClient. Причините са няколко:например когато затворите връзка и след това извикате .find правилно ще задейства грешка при обратно извикване, докато с MongoClient няма да го направи.

Ако използвате MongoClient:

MongoClient.connect('mongodb://localhost:27017/testdb', function(err, db) {
  if (!err) {
    db.on('close', function() {
      if (this._callBackStore) {
        for(var key in this._callBackStore._notReplied) {
          this._callHandler(key, null, 'Connection Closed!');
        }
      }
    });

    // ...

  } else {
    console.log(err);
  }
});

Какво ще направи това? След като връзката бъде затворена, тя ще премине през всички _notReplied курсори и ще задейства събития за тях с грешка Connection Closed! .

Тестов случай:

items.find({ }).toArray(function(err, data) {
  if (!err) {
    console.log('Items found successfully');
  } else {
    console.log(err);
  }
});
db.close();

Това ще принуди да затвори връзката с базата данни и ще задейства close събитие, което обработите по-рано и ще се уверите, че курсорът ще бъде затворен.

UPD:Добавих проблем в GitHub:https://github.com /mongodb/node-mongodb-native/issues/1092 ще видим какво ще кажат по въпроса.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Произволен ред на сортиране

  2. Ред на събитията за уеб кукички в лента

  3. Времето за изчакване на връзката изтича след надграждане на MongoDB.Driver от 2.7.0 на 2.7.1

  4. Как да проектираме само съвпадащи полета на вложен масив в заявка за mongo shell

  5. Препратки към документ Mongoose с връзка „едно към много“.