sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongo db med Monk:felsökning och hantering om db är nere

Du kan faktiskt ställa in bufferMaxEntries alternativ ( dokumenterat under Db men föråldrat för det objektet, använd på "översta nivå som visas istället") på anslutningen, vilket i princip stoppar "köa" förfrågningar på drivrutinen när ingen anslutning faktiskt finns.

Som ett minimalt exempel:

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;

Så jag väntar faktiskt på att databasanslutningen åtminstone ska vara närvarande vid "start upp" här, men egentligen bara till exempel eftersom jag vill infoga lite data för att faktiskt hämta. Det är inte nödvändigt, men grundkonceptet är att vänta på Promise att lösa:

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

Lite trivialt och egentligen inte nödvändigt för din faktiska kod. Men jag tycker fortfarande att det är bra praxis.

Det riktiga testet görs genom att stoppa mongod eller på annat sätt göra servern oåtkomlig och sedan utfärda en begäran.

Eftersom vi ställer in anslutningsalternativen till { bufferMaxEntries: 0 } detta betyder att omedelbart När du försöker utfärda ett kommando till databasen kommer felet att returneras om det inte finns någon faktisk anslutning.

Naturligtvis när databasen blir tillgänglig igen kommer du inte att få felet och instruktionerna kommer att ske normalt.

Utan alternativet är standarden att "köa" operationerna tills en anslutning är löst och sedan "bufferten" "spelas upp".

Du kan simulera detta (som jag gjorde) genom att "stoppa" mongod daemon och utfärdande av förfrågningar. Sedan "startar" demonen och skickar förfrågningar. Det bör helt enkelt returnera det fångade felsvaret.




  1. Det gick inte att starta redis.service:Enheten redis-server.service är maskerad

  2. Geospatial $nära inom aktuellt dokumentfältvärde

  3. Lägg upp dokument och/eller lägg till ett underdokument

  4. UpdateMany i MongoDB körs två gånger med $inc