MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Mongo db com Monk:captura e manipulação de erros se o db estiver inativo


Bem, você pode definir o bufferMaxEntries opção ( documentada em Db mas preterido para o uso desse objeto, use no "nível superior, conforme demonstrado" ) na conexão, que essencialmente interrompe as solicitações de "enfileiramento" no driver quando nenhuma conexão está realmente presente.

Como um exemplo 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);
  }

})();

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;

Então, na verdade, estou aguardando a conexão do banco de dados para pelo menos estar presente na "inicialização" aqui, mas realmente apenas por exemplo, pois quero inserir alguns dados para realmente recuperar. Não é obrigatório, mas o conceito básico é esperar pela Promise resolver:
await db.then(() => 1);

Meio trivial e não é realmente necessário para o seu código real. Mas ainda acho que é uma boa prática.

O teste real é feito parando mongod ou, de outra forma, tornar o servidor inacessível e, em seguida, emitir uma solicitação.

Como definimos as opções de conexão para { bufferMaxEntries: 0 } isso significa que imediatamente à medida que você tenta emitir um comando para o banco de dados, a falha será retornada se não houver uma conexão real presente.

Claro que quando o banco de dados estiver disponível novamente, você não receberá o erro e as instruções acontecerão normalmente.

Sem a opção, o padrão é "enfileirar" as operações até que uma conexão seja resolvida e, em seguida, o "buffer" seja essencialmente "reproduzido".

Você pode simular isso (como eu fiz) "parando" o mongod daemon e emitindo requisições. Em seguida, "iniciando" o daemon e emitindo solicitações. Ele deve simplesmente retornar a resposta de erro capturada.