我想在MongoDB连接中添加事件监听器,以便在连接断开,每次重新连接尝试以及成功重新连接尝试时运行。
我阅读了所有官方文档和API,但我无法找到解决方案。
目前,我有这个,但只有超时事件有效。 //如果我们还没有初始化一个' MongoClient',请初始化一个并保存它。 if(!this.client)this.client = new MongoClient();
this.connection = await this.client.connect(connectionString, this.settings);
this.client.server.on('connect', event => {
console.log(event);
});
this.client.server.on('error', event => {
console.log(event);
});
this.client.server.on('reconnect', event => {
console.log(event);
});
this.client.server.on('connections', event => {
console.log(event);
});
this.client.server.on('timeout', event => {
console.log(event);
});
this.client.server.on('all', event => {
console.log(event);
});
我尝试了这里列出的事件,但它们有效,但没有"重新连接"事件: http://mongodb.github.io/node-mongodb-native/2.2/reference/management/sdam-monitoring/
答案 0 :(得分:6)
当然可以。基本上,你需要在低于MongoClient
本身的基础上进入EventEmitter。
你可以清楚地看到这些东西存在,因为它们在“日志记录”中可见,可以通过以下设置在驱动程序中打开:
{ "loggerLevel": "info" }
从那时起,它实际上只是涉及到实际的源发射器。我已经在下面的列表中完成了这些操作,并且包括一个小技巧,用于从给定的发出中获取枚举事件,这被我自己用来跟踪它:
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)
}
})()
所以这两个听众定义了:
db.s.topology.on('close', () => console.log('Connection closed') );
db.s.topology.on('reconnect', () => console.log('Reconnected') );
当连接断开并且实现重新连接时,将会触发。还有其他一些事情,例如重新连接尝试,它们也在事件发射器中,就像您在启用loggerLevel
设置时看到的那样。