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.