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

Ouvir eventos de reconexão no driver MongoDB


Certamente você pode. Basicamente, porém, você precisa acessar o EventEmitter em um nível mais baixo do que basicamente fora do MongoClient em si.

Você pode ver claramente que essas coisas existem, pois são visíveis no "log", que pode ser ativado no driver através da configuração:
{ "loggerLevel": "info" }

A partir de então, é apenas uma questão de tocar no emissor da fonte real. Eu fiz isso na listagem a seguir, além de incluir um pequeno truque para obter os eventos enumerados de uma determinada emissão, que foi reconhecidamente usado por mim para rastrear isso:
const MongoClient = require('mongodb').MongoClient;

function patchEmitter(emitter) {
  var oldEmit = emitter.emit;

  emitter.emit = function() {
    var emitArgs = arguments;

    console.log(emitArgs);

    oldEmit.apply(emitter, arguments);
  }

}


(async function() {

  let db;

  try {

    const client = new MongoClient();

    client.on('serverOpening', () => console.log('connected') );

    db = await client.connect('mongodb://localhost/test', {
      //loggerLevel: 'info'
    });

    //patchEmitter(db.s.topology);

    db.s.topology.on('close', () => console.log('Connection closed') );
    db.s.topology.on('reconnect', () => console.log('Reconnected') );


  } catch(e) {
    console.error(e)
  }

})()

Então esses dois ouvintes definiram:
    db.s.topology.on('close', () => console.log('Connection closed') );
    db.s.topology.on('reconnect', () => console.log('Reconnected') );

Vão disparar quando a conexão cair e quando uma reconexão for alcançada. Há também outras coisas, como tentativas de reconexão, que também estão no emissor de eventos, como você veria com o loggerLevel configuração ativada.