sql >> Base de Datos >  >> NoSQL >> MongoDB

Mongo db con Monk:captura y manejo de errores si db está inactivo

Bueno, en realidad puedes configurar bufferMaxEntries opción ( documentada en Db pero en desuso para el uso de ese objeto, use en "nivel superior como se muestra en su lugar") en la conexión, lo que esencialmente detiene las solicitudes de "puesta en cola" en el controlador cuando no hay una conexión realmente presente.

Como un ejemplo mínimo:

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);
  }

})();

rutas.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;

Así que en realidad estoy esperando que la conexión de la base de datos esté presente al menos en el "inicio" aquí, pero en realidad solo por ejemplo, ya que quiero insertar algunos datos para recuperarlos. No es obligatorio, pero el concepto básico es esperar la Promise para resolver:

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

Algo trivial, y no realmente necesario para su código real. Pero sigo pensando que es una buena práctica.

La verdadera prueba se realiza deteniendo mongod o hacer que el servidor sea inalcanzable y luego emitir una solicitud.

Dado que configuramos las opciones de conexión en { bufferMaxEntries: 0 } esto significa que inmediatamente cuando intente enviar un comando a la base de datos, se devolverá el error si no hay una conexión real presente.

Por supuesto, cuando la base de datos vuelva a estar disponible, no recibirá el error y las instrucciones seguirán normalmente.

Sin la opción, el valor predeterminado es "poner en cola" las operaciones hasta que se resuelva una conexión y luego el "búfer" se "reproduzca" esencialmente.

Puede simular esto (como lo hice yo) "deteniendo" el mongod demonio y emisión de solicitudes. Luego "iniciar" el demonio y emitir solicitudes. Simplemente debería devolver la respuesta de error detectada.