diff --git a/lib/drivers/node-mongodb-native/connection.js b/lib/drivers/node-mongodb-native/connection.js index 3c64ff2216f..6a164bca8b3 100644 --- a/lib/drivers/node-mongodb-native/connection.js +++ b/lib/drivers/node-mongodb-native/connection.js @@ -410,6 +410,12 @@ function _setClient(conn, client, options, dbName) { }); } + if (options.monitorCommands) { + client.on('commandStarted', (data) => conn.emit('commandStarted', data)); + client.on('commandFailed', (data) => conn.emit('commandFailed', data)); + client.on('commandSucceeded', (data) => conn.emit('commandSucceeded', data)); + } + conn.onOpen(); for (const i in conn.collections) { diff --git a/test/connection.test.js b/test/connection.test.js index 4554436fca8..d395be5511b 100644 --- a/test/connection.test.js +++ b/test/connection.test.js @@ -210,7 +210,7 @@ describe('connections:', function() { let conn; before(async function() { - conn = mongoose.createConnection(start.uri2); + conn = mongoose.createConnection(start.uri2, { monitorCommands: true }); await conn.asPromise(); await conn.collection('test').deleteMany({}); return conn; @@ -254,6 +254,28 @@ describe('connections:', function() { assert.equal(events[1].method, 'findOne'); assert.deepStrictEqual(events[1].result, { _id: 17, answer: 42 }); }); + + it('commandStarted, commandFailed, commandSucceeded (gh-14611)', async function() { + let events = []; + conn.on('commandStarted', event => events.push(event)); + conn.on('commandFailed', event => events.push(event)); + conn.on('commandSucceeded', event => events.push(event)); + + await conn.collection('test').insertOne({ _id: 14611, answer: 42 }); + assert.equal(events.length, 2); + assert.equal(events[0].constructor.name, 'CommandStartedEvent'); + assert.equal(events[0].commandName, 'insert'); + assert.equal(events[1].constructor.name, 'CommandSucceededEvent'); + assert.equal(events[1].requestId, events[0].requestId); + + events = []; + await conn.createCollection('tests', { capped: 1024 }).catch(() => {}); + assert.equal(events.length, 2); + assert.equal(events[0].constructor.name, 'CommandStartedEvent'); + assert.equal(events[0].commandName, 'create'); + assert.equal(events[1].constructor.name, 'CommandFailedEvent'); + assert.equal(events[1].requestId, events[0].requestId); + }); }); it('should allow closing a closed connection', async function() {