【问题标题】:Listen to reconnect events in MongoDB driver监听 MongoDB 驱动程序中的重新连接事件
【发布时间】:2017-07-16 12:29:38
【问题描述】:

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

【问题讨论】:

  • 我不是在问如何重新连接,我知道如何,我是在问如何监听事件,以便在事件发生时运行自己的函数
  • 如果没有重新连接事件,则没有重新连接事件。无论如何,您如何定义“重新连接”而不是新连接?

标签: node.js mongodb


【解决方案1】:

当然可以。基本上,尽管您需要在比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 设置时看到的那样。

【讨论】:

  • 谢谢你,这很有效,还帮助我找到了其他有用的事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多