sql >> Databáze >  >> NoSQL >> MongoDB

Mongo db s Monkem:zachycení chyb a zpracování, pokud je db mimo provoz

Vlastně můžete nastavit bufferMaxEntries možnost ( zdokumentováno pod Db ale zastaralé pro použití tohoto objektu, použijte na připojení na "nejvyšší úrovni, jak je ukázáno" ), což v podstatě zastaví "řadění" požadavků na ovladač, když ve skutečnosti není žádné připojení.

Jako minimální příklad:

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;

Takže vlastně čekám, že zde bude připojení k databázi alespoň přítomno při "spouštění", ale opravdu jen například proto, že chci vložit nějaká data, abych je skutečně načetl. Není to povinné, ale základním konceptem je počkat na Promise vyřešit:

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

Trochu triviální a pro váš skutečný kód to není opravdu nutné. Ale stále si myslím, že je to dobrá praxe.

Skutečný test se provádí zastavením mongod nebo jiným způsobem učinit server nedostupným a poté odeslat požadavek.

Protože jsme nastavili možnosti připojení na { bufferMaxEntries: 0 } to znamená, že okamžitě při pokusu o zadání příkazu do databáze se chyba vrátí, pokud není k dispozici žádné skutečné připojení.

Samozřejmě, když bude databáze znovu dostupná, chyba se nezobrazí a pokyny proběhnou normálně.

Bez této možnosti je výchozím nastavením „zařadit do fronty“ operace, dokud se nevyřeší připojení a poté se „vyrovnávací paměť“ v podstatě „přehraje“.

Můžete to simulovat (jako já) "zastavením" mongod démon a vydávání požadavků. Poté "spuštění" démona a vydávání požadavků. Měl by jednoduše vrátit odpověď na zachycenou chybu.




  1. upsert pole ve vnořeném dokumentu v poli podle indexu v MongoDB

  2. Vložte nový objekt do pole pole vnořeného dokumentu v mongoose

  3. provádět pouze jednu z mnoha duplicitních úloh pomocí sidekiq?

  4. mongodb show dbs listDatabases se nezdařilo