2017-07-16 56 views
3

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

+0

可能重複[如何在node.js服務器中自動重新連接mongo?](https://stackoverflow.com/questions/7559442/how-to-re-connect-mongo-automatically-in-node-js-server) – frozen

+0

我不是問如何重新連接,我知道如何,我問如何聽事件,所以我可以在發生時運行我自己的功能 –

+0

如果沒有重新連接事件,那麼沒有重新連接事件。無論如何,你會如何定義一個「重新連接」的新連接? – Paul

回答

4

當然可以。基本上,雖然你需要在比基本上不在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設置時看到的那樣。

+0

謝謝,這有效,也幫助我找到其他有用的事件。 –