收听MongoDB驱动程序

时间:2017-07-16 01:11:50

标签: node.js mongodb

我想在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/

1 个答案:

答案 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设置时看到的那样。