sql >> Database >  >> NoSQL >> MongoDB

Mongo db met Monk:fouten opvangen en afhandelen als db niet werkt

Nou, je kunt eigenlijk de bufferMaxEntries . instellen optie ( gedocumenteerd onder Db maar afgekeurd voor dat objectgebruik, gebruik op "topniveau zoals gedemonstreerd in plaats daarvan") op de verbinding, die in wezen stopt met het "in de wachtrij plaatsen" van verzoeken op het stuurprogramma wanneer er geen verbinding aanwezig is.

Als minimaal voorbeeld:

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;

Dus ik wacht eigenlijk op de databaseverbinding om hier op zijn minst aanwezig te zijn bij "opstarten", maar eigenlijk alleen omdat ik wat gegevens wil invoegen om daadwerkelijk op te halen. Het is niet verplicht, maar het basisconcept is om te wachten op de Promise oplossen:

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

Een beetje triviaal, en niet echt vereist voor uw eigenlijke code. Maar ik denk nog steeds dat het een goede gewoonte is.

De echte test wordt gedaan door mongod te stoppen of anderszins de server onbereikbaar maken en vervolgens een verzoek indienen.

Omdat we de verbindingsopties hebben ingesteld op { bufferMaxEntries: 0 } dit betekent dat onmiddellijk als u probeert een opdracht aan de database te geven, wordt de fout geretourneerd als er geen daadwerkelijke verbinding aanwezig is.

Wanneer de database weer beschikbaar komt, krijg je de foutmelding natuurlijk niet en worden de instructies normaal uitgevoerd.

Zonder de optie is de standaardinstelling om de bewerkingen "in de wachtrij te plaatsen" totdat een verbinding is opgelost en dan wordt de "buffer" in wezen "afgespeeld".

Je kunt dit simuleren (zoals ik deed) door de mongod te "stoppen" daemon en het uitgeven van verzoeken. Vervolgens de daemon "starten" en verzoeken uitgeven. Het zou gewoon de opgevangen fout moeten retourneren.




  1. Hoe maak je een model in DRY-patroon met behulp van flow.js (voor asynchrone oproepen) in node.js?

  2. Hoe de slave-status van mongodb te krijgen met behulp van nodejs?

  3. Fatale fout:klasse 'MongoDate' niet gevonden bij gebruik van mongodb php-stuurprogramma 1.1.2 en PHP 7.0.2 - Laravel 5.1

  4. Rails en caching, is het makkelijk om te wisselen tussen memcache en redis?