MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mongo db avec Monk :capture et gestion des erreurs si la base de données est en panne

Eh bien, vous pouvez réellement définir le bufferMaxEntries option ( documentée sous Db mais obsolète pour cette utilisation d'objet, utilisez plutôt "au niveau supérieur comme démontré" ) sur la connexion, ce qui arrête essentiellement les demandes de "mise en file d'attente" sur le pilote lorsqu'aucune connexion n'est réellement présente.

À titre d'exemple minimal :

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;

Donc j'attends en fait que la connexion à la base de données soit au moins présente au "démarrage" ici, mais vraiment seulement par exemple puisque je veux insérer des données à récupérer réellement. Ce n'est pas obligatoire, mais le concept de base est d'attendre la Promise à résoudre :

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

Un peu trivial, et pas vraiment nécessaire pour votre code réel. Mais je pense toujours que c'est une bonne pratique.

Le vrai test se fait en arrêtant mongod ou rendre le serveur inaccessible, puis émettre une requête.

Puisque nous avons défini les options de connexion sur { bufferMaxEntries: 0 } cela signifie que immédiatement lorsque vous tentez d'émettre une commande vers la base de données, l'échec sera renvoyé s'il n'y a pas de connexion réelle présente.

Bien sûr, lorsque la base de données redeviendra disponible, vous n'obtiendrez pas l'erreur et les instructions se produiront normalement.

Sans l'option, la valeur par défaut est de "mettre en file d'attente" les opérations jusqu'à ce qu'une connexion soit résolue, puis le "tampon" est essentiellement "joué".

Vous pouvez simuler cela (comme je l'ai fait) en "arrêtant" le mongod démon et émission de requêtes. Puis "démarrer" le démon et émettre des requêtes. Il doit simplement renvoyer la réponse d'erreur interceptée.