Chắc chắn bạn có thể. Về cơ bản, mặc dù bạn cần phải khai thác EventEmitter ở cấp độ thấp hơn so với cơ bản là tắt MongoClient
chính nó.
Bạn có thể thấy rõ rằng những thứ như vậy tồn tại vì chúng được hiển thị trong "ghi nhật ký", có thể được bật trong trình điều khiển thông qua cài đặt:
{ "loggerLevel": "info" }
Từ đó, nó thực sự chỉ là một vấn đề của việc khai thác vào bộ phát nguồn thực tế. Tôi đã thực hiện những điều này trong danh sách sau đây, cũng như bao gồm một mẹo nhỏ để lấy các sự kiện được liệt kê từ một phát ra đã cho, được chính tôi sử dụng để theo dõi điều này:
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)
}
})()
Vì vậy, hai người nghe đó đã xác định:
db.s.topology.on('close', () => console.log('Connection closed') );
db.s.topology.on('reconnect', () => console.log('Reconnected') );
Sẽ hoạt động khi kết nối bị ngắt và khi kết nối lại được. Ngoài ra còn có những thứ khác như nỗ lực kết nối lại cũng nằm trong trình phát sự kiện giống như bạn sẽ thấy với loggerLevel
đã bật cài đặt.