MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Mongo db con Monk:rilevamento e gestione degli errori se db è inattivo

Bene, puoi effettivamente impostare bufferMaxEntries opzione ( documentata in Db ma deprecato per l'utilizzo di quell'oggetto, utilizzare a "livello superiore come dimostrato invece" ) sulla connessione, che essenzialmente interrompe le richieste di "accodamento" sul driver quando non è effettivamente presente alcuna connessione.

Come esempio minimo:

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;

Quindi sto effettivamente aspettando che la connessione al database sia almeno presente su "avvio" qui, ma in realtà solo ad esempio poiché voglio inserire alcuni dati da recuperare effettivamente. Non è obbligatorio, ma il concetto di base è attendere la Promise risolvere:

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

Un po' banale e non proprio necessario per il tuo codice effettivo. Ma continuo a pensare che sia una buona pratica.

Il vero test viene fatto arrestando mongod o altrimenti rendendo il server irraggiungibile e quindi inviando una richiesta.

Poiché impostiamo le opzioni di connessione su { bufferMaxEntries: 0 } questo significa che immediatamente quando si tenta di inviare un comando al database, l'errore verrà restituito se non è presente alcuna connessione effettiva.

Ovviamente quando il database sarà nuovamente disponibile, non riceverai l'errore e le istruzioni verranno visualizzate normalmente.

Senza l'opzione l'impostazione predefinita è "mettere in coda" le operazioni fino a quando una connessione non viene risolta e quindi il "buffer" viene essenzialmente "riprodotto".

Puoi simulare questo (come ho fatto io) "fermando" il mongod demone ed emettere richieste. Quindi "avviare" il demone ed emettere richieste. Dovrebbe semplicemente restituire la risposta all'errore rilevato.