Skip to content

Commit

Permalink
fix(NODE-3463): pass explain error through to callback (#2949)
Browse files Browse the repository at this point in the history
  • Loading branch information
emadum committed Aug 25, 2021
1 parent 238a4b0 commit e5975af
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 3 deletions.
10 changes: 7 additions & 3 deletions lib/core/wireprotocol/query.js
Expand Up @@ -37,9 +37,13 @@ function query(server, ns, cmd, cursorState, options, callback) {

// If we have explain, we need to rewrite the find command
// to wrap it in the explain command
const explain = Explain.fromOptions(options);
if (explain) {
findCmd = decorateWithExplain(findCmd, explain);
try {
const explain = Explain.fromOptions(options);
if (explain) {
findCmd = decorateWithExplain(findCmd, explain);
}
} catch (err) {
return callback(err);
}

// NOTE: This actually modifies the passed in cmd, and our code _depends_ on this
Expand Down
40 changes: 40 additions & 0 deletions test/functional/explain.test.js
Expand Up @@ -3,6 +3,7 @@ const chai = require('chai');
const expect = chai.expect;
const withClient = require('./shared').withClient;
const setupDatabase = require('./shared').setupDatabase;
const MongoError = require('../../index').MongoError;

describe('Explain', function() {
before(function() {
Expand Down Expand Up @@ -762,4 +763,43 @@ describe('Explain', function() {
});
})
);

it('should throw a catchable error with invalid explain string (promise)', {
metadata: {
requires: {
mongodb: '>=3.4'
}
},
test: withClient(function(client, done) {
const db = client.db('shouldThrowCatchableError');
const collection = db.collection('test');
collection
.find({ a: 1 })
.explain('invalidExplain')
.then(() => done(new Error('expected explain to fail but it succeeded')))
.catch(err => {
expect(err).to.exist;
expect(err).to.be.instanceOf(MongoError);
done();
});
})
});

it('should throw a catchable error with invalid explain string (callback)', {
metadata: {
requires: {
mongodb: '>=3.4'
}
},
test: withClient(function(client, done) {
const db = client.db('shouldThrowCatchableError');
const collection = db.collection('test');
collection.find({ a: 1 }).explain('invalidExplain', (err, result) => {
expect(err).to.exist;
expect(result).to.not.exist;
expect(err).to.be.instanceOf(MongoError);
done();
});
})
});
});

0 comments on commit e5975af

Please sign in to comment.