Oczywiście że możesz. Zasadniczo jednak musisz dotknąć EventEmitter na niższym poziomie niż w zasadzie poza MongoClient
się.
Widać wyraźnie, że takie rzeczy istnieją, ponieważ są one widoczne w „logowaniu”, które można włączyć w sterowniku za pomocą ustawienia:
{ "loggerLevel": "info" }
Od tego momentu to naprawdę tylko kwestia podłączenia do rzeczywistego emitera źródłowego. Zrobiłem to w poniższym zestawieniu, a także dołączyłem małą sztuczkę do uzyskania wyliczonych zdarzeń z danego emitowanego, która została wprawdzie wykorzystana przeze mnie do śledzenia tego:
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)
}
})()
Więc ci dwaj słuchacze zdefiniowali:
db.s.topology.on('close', () => console.log('Connection closed') );
db.s.topology.on('reconnect', () => console.log('Reconnected') );
Zaczną działać, gdy połączenie zostanie zerwane i gdy zostanie osiągnięte ponowne połączenie. Istnieją również inne rzeczy, takie jak próby ponownego połączenia, które również znajdują się w emiterze zdarzeń, tak jak w przypadku loggerLevel
ustawienie włączone.