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

Mongo db med Monk:fejlfinding og håndtering, hvis db er nede

Nå, du kan faktisk indstille bufferMaxEntries mulighed (dokumenteret under Db men forældet for det pågældende objektbrug, brug på "topniveau som vist i stedet") på forbindelsen, hvilket i det væsentlige stopper "kø"-anmodninger på driveren, når der faktisk ikke er nogen forbindelse til stede.

Som et minimalt eksempel:

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å jeg afventer faktisk databaseforbindelsen til i det mindste at være til stede ved "opstart" her, men egentlig kun for eksempel, da jeg vil indsætte nogle data for rent faktisk at hente. Det er ikke påkrævet, men det grundlæggende koncept er at vente på Promise at løse:

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

Slags trivielt, og ikke rigtig påkrævet for din faktiske kode. Men jeg synes stadig, det er god praksis.

Den rigtige test udføres ved at stoppe mongod eller på anden måde gøre serveren utilgængelig og derefter udstede en anmodning.

Da vi indstiller forbindelsesmulighederne til { bufferMaxEntries: 0 } det betyder, at med det samme Når du forsøger at udstede en kommando til databasen, vil fejlen blive returneret, hvis der ikke er nogen egentlig forbindelse til stede.

Når databasen bliver tilgængelig igen, får du selvfølgelig ikke fejlen, og instruktionerne vil ske normalt.

Uden muligheden er standarden at "en-kø" operationerne, indtil en forbindelse er løst, og derefter "bufferen" er i det væsentlige "afspillet".

Du kan simulere dette (som jeg gjorde) ved at "stoppe" mongod dæmon og udstedelse af anmodninger. Derefter "starter" dæmonen og udsteder anmodninger. Det skulle blot returnere det fangede fejlsvar.




  1. MongoDB:Er masseoperationer skrevet til oploggen som helhed?

  2. MongoDB php-driver, der får apache på XAMPP OS X til at fejle

  3. Scala-serialiseringsundtagelse med enumerationsværdi

  4. Hvordan ignorerer man nuller, mens man fjerner et MongoDB-dokument?