MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongo db mit Monk:Fehler abfangen und behandeln, wenn db ausgefallen ist

Nun, Sie können tatsächlich die bufferMaxEntries setzen Option (dokumentiert unter Db aber veraltet für diese Objektverwendung, verwenden Sie stattdessen "auf oberster Ebene, wie demonstriert" ) für die Verbindung, was im Wesentlichen das "Einreihen" von Anfragen an den Treiber stoppt, wenn tatsächlich keine Verbindung vorhanden ist.

Als Minimalbeispiel:

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;

Also warte ich eigentlich darauf, dass die Datenbankverbindung hier zumindest beim "Starten" vorhanden ist, aber wirklich nur zum Beispiel, da ich einige Daten einfügen möchte, um sie tatsächlich abzurufen. Es ist nicht erforderlich, aber das grundlegende Konzept besteht darin, auf das Promise zu warten zu lösen:

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

Irgendwie trivial und für Ihren eigentlichen Code nicht wirklich erforderlich. Aber ich denke immer noch, dass es eine gute Übung ist.

Der eigentliche Test wird durch Stoppen von mongod durchgeführt oder den Server auf andere Weise unerreichbar machen und dann eine Anfrage stellen.

Da wir die Verbindungsoptionen auf { bufferMaxEntries: 0 } gesetzt haben das bedeutet sofort Wenn Sie versuchen, einen Befehl an die Datenbank auszugeben, wird der Fehler zurückgegeben, wenn keine tatsächliche Verbindung vorhanden ist.

Wenn die Datenbank wieder verfügbar ist, erhalten Sie den Fehler natürlich nicht und die Anweisungen werden normal ausgeführt.

Ohne die Option werden die Operationen standardmäßig "in die Warteschlange gestellt", bis eine Verbindung aufgelöst wird, und dann wird der "Puffer" im Wesentlichen "abgespielt".

Sie können dies simulieren (wie ich es getan habe), indem Sie den mongod "stoppen". Daemon und das Ausgeben von Anfragen. Dann den Daemon "starten" und Anfragen ausgeben. Es sollte einfach die abgefangene Fehlerantwort zurückgeben.