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

Mongo db dengan Monk:kesalahan menangkap dan menangani jika db turun

Anda sebenarnya dapat mengatur bufferMaxEntries opsi ( didokumentasikan di bawah Db tetapi tidak digunakan lagi untuk penggunaan objek tersebut, gunakan di "tingkat atas seperti yang ditunjukkan sebagai gantinya" ) pada koneksi, yang pada dasarnya menghentikan permintaan "mengantre" pada driver saat tidak ada koneksi yang benar-benar ada.

Sebagai contoh minimal:

index.js

const express = require('express'),
      morgan = require('morgan'),
      db = require('monk')('localhost/test',{ bufferMaxEntries: 0 }),
      app = express();

const routes = require('./routes');

app.use(morgan('combined'));

app.use((req,res,next) => {
  req.db = db;
  next();
});

app.use('/', routes);

(async function() {

  try {

    await db.then(() => 1);

    let collection = db.get('test');
    await collection.remove({});

    await collection.insert(Array(5).fill(1).map((e,i) => ({ a: i+1 })));
    console.log('inserted test data');

    await app.listen(3000,'0.0.0.0');
    console.log('App waiting');

  } catch(e) {
    console.error(e);
  }

})();

routes.js

var router = require('express').Router();

router.get('/', async (req,res) => {
  try {
    let db = req.db,
        collection = db.get('test');

    let response = await collection.find();
    res.json(response);
  } catch(e) {
    res.status(500).json(e);
  }
});

module.exports = router;

Jadi saya sebenarnya menunggu koneksi database untuk setidaknya hadir pada "start up" di sini, tetapi sebenarnya hanya sebagai contoh karena saya ingin memasukkan beberapa data untuk benar-benar diambil. Tidak wajib, tapi konsep dasarnya adalah menunggu Promise untuk menyelesaikan:

await db.then(() => 1);

Agak sepele, dan tidak terlalu diperlukan untuk kode Anda yang sebenarnya. Tapi saya tetap berpikir itu adalah praktik yang baik.

Tes sebenarnya dilakukan dengan menghentikan mongod atau sebaliknya membuat server tidak dapat dijangkau dan kemudian mengeluarkan permintaan.

Karena kita menyetel opsi koneksi ke { bufferMaxEntries: 0 } ini berarti segera saat Anda mencoba mengeluarkan perintah ke database, kegagalan akan dikembalikan jika tidak ada koneksi yang sebenarnya.

Tentu saja ketika database tersedia kembali, Anda tidak akan mendapatkan kesalahan dan instruksi akan berjalan normal.

Tanpa opsi, defaultnya adalah "mengantrekan" operasi sampai koneksi diselesaikan dan kemudian "buffer" pada dasarnya "dimainkan".

Anda dapat mensimulasikan ini (seperti yang saya lakukan) dengan "menghentikan" mongod daemon dan mengeluarkan permintaan. Kemudian "memulai" daemon dan mengeluarkan permintaan. Seharusnya hanya mengembalikan respons kesalahan yang tertangkap.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Menjalankan MongoDB 4.2 yang direplikasi di Kubernetes:konfigurasi replset tidak diterima

  2. Driver MongoDB C# dan bidang DateTime

  3. Ubah kueri MongoDB menjadi Java

  4. Mencetak output kueri Mongo ke file saat berada di shell mongo

  5. Dapatkan DateTime dari koleksi mongo menggunakan c# driver