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

Escuche los eventos de reconexión en el controlador MongoDB

Seguro que puede. Básicamente, aunque necesita acceder al EventEmitter en un nivel más bajo que básicamente fuera del MongoClient mismo.

Puede ver claramente que tales cosas existen ya que son visibles en "registro", que se puede activar en el controlador a través de la configuración:

{ "loggerLevel": "info" }

A partir de entonces, en realidad es solo una cuestión de aprovechar el emisor de la fuente real. He hecho esto en la siguiente lista, además de incluir un pequeño truco para obtener los eventos enumerados de un determinado emitido, que ciertamente utilicé para rastrear esto:

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

})()

Entonces esos dos oyentes definieron:

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

Se dispararán cuando se caiga la conexión y cuando se logre una reconexión. También hay otras cosas, como intentos de reconexión, que también están en el emisor de eventos, tal como lo vería con el loggerLevel configuración activada.