MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Ascolta per riconnettere gli eventi nel driver MongoDB

Certo che puoi. Fondamentalmente, però, devi attingere a EventEmitter a un livello inferiore rispetto a fondamentalmente al di fuori di MongoClient stesso.

Puoi vedere chiaramente che tali cose esistono poiché sono visibili nella "registrazione", che può essere attivata nel driver tramite l'impostazione:

{ "loggerLevel": "info" }

Da allora è davvero solo una questione di attingere all'effettivo emettitore della sorgente. Ho fatto questi nel seguente elenco, oltre a includere un piccolo trucco per ottenere gli eventi enumerati da un dato emesso, che è stato certamente utilizzato da me per rintracciarlo:

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

})()

Così quei due ascoltatori hanno definito:

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

Si attiveranno quando la connessione si interrompe e quando viene raggiunta una riconnessione. Ci sono anche altre cose come i tentativi di riconnessione che sono anche nell'emettitore di eventi, proprio come vedresti con loggerLevel impostazione attivata.