MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Menangani batas waktu dengan Node.js dan mongodb

UPD:
Berdasarkan postingan ini, sepertinya mereka telah menerapkan perbaikan yang akan melakukan hal yang sama seperti yang kami lakukan di sini. Tidak yakin apakah ini sudah dalam npm (15.10.13). https://github.com/mongodb/node -mongodb-native/issues/1092#ref-commit-2667d13

Setelah beberapa penyelidikan, saya berhasil memahami apa yang terjadi di sana:
Setiap kali Anda memanggil metode apa pun untuk menangani basis data (menemukan, memperbarui, menyisipkan, dll.) ia membuat kursor, yang memiliki ID sendiri dan mendaftar sendiri ke EventEmitter dari Db untuk dipanggil kembali nanti. Sementara itu ia mendaftarkan dirinya ke objek _notReplied dalam CallBackStore yang sama.

Tetapi begitu koneksi ditutup, saya tidak dapat menemukan apa pun yang akan beralih melalui kursor _notReplied dan akan memicunya dengan kesalahan atau logika apa pun dengan penghitung waktu (mungkin masih ada di suatu tempat di sana). Jadi saya sudah berhasil menulis pekerjaan kecil, yang memaksa memicu kursor dengan kesalahan ketika DB memancarkan close acara:

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

Saya sarankan menggunakan pendekatan pertama daripada MongoClient. Alasannya sedikit:misalnya ketika Anda menutup koneksi dan kemudian memanggil .find itu akan memicu kesalahan dalam panggilan balik dengan benar, sementara dengan MongoClient tidak.

Jika Anda menggunakan 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);
  }
});

Apa yang akan dilakukan ini? Setelah koneksi ditutup, itu akan beralih melalui Semua kursor _notReplied dan memicu peristiwa untuk mereka dengan kesalahan Connection Closed! .

Kasus uji:

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

Itu akan memaksa koneksi database dekat dan memicu close acara yang Anda tangani sebelumnya dan akan memastikan bahwa kursor akan ditutup.

UPD:Saya telah menambahkan Masalah di GitHub:https://github.com /mongodb/node-mongodb-native/issues/1092 kita akan melihat apa yang mereka katakan tentang ini.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Menyimpan file di mongodb menggunakan node.js

  2. Bagaimana cara mengganti ScriptDb yang sudah usang dengan Mongodb menggunakan layanan URL Fetch?

  3. Driver MongoDB C#, kueri oleh elemen array menggunakan regex

  4. Mongoose:Tidak dapat mengambil dokumen file dari koleksi .chunk tanpa bidang data

  5. Update/upser luwak?