diff --git a/lib/bulk/common.js b/lib/bulk/common.js index 884fdf26a2..8634ce0171 100644 --- a/lib/bulk/common.js +++ b/lib/bulk/common.js @@ -1115,11 +1115,15 @@ class BulkOperationBase { return true; } + const msg = this.s.bulkResult.writeErrors[0].errmsg + ? this.s.bulkResult.writeErrors[0].errmsg + : 'write operation failed'; + handleCallback( callback, new BulkWriteError( toError({ - message: 'write operation failed', + message: msg, code: this.s.bulkResult.writeErrors[0].code, writeErrors: this.s.bulkResult.writeErrors }), diff --git a/test/functional/bulk_tests.js b/test/functional/bulk_tests.js index 2362f141c8..31d6c280f0 100644 --- a/test/functional/bulk_tests.js +++ b/test/functional/bulk_tests.js @@ -937,6 +937,59 @@ describe('Bulk', function() { } }); + it('should provide descriptive error message for unordered batch with duplicate key errors on inserts', function(done) { + const configuration = this.configuration; + const client = configuration.newClient(configuration.writeConcernMax(), { + poolSize: 1 + }); + + client.connect((err, client) => { + const db = client.db(configuration.db); + const col = db.collection('err_batch_write_unordered_ops_legacy_6'); + + // Add unique index on a field causing all inserts to fail + col.createIndexes( + [ + { + name: 'err_batch_write_unordered_ops_legacy_6', + key: { a: 1 }, + unique: true + } + ], + err => { + expect(err).to.not.exist; + + // Initialize the unordered Batch + const batch = col.initializeUnorderedBulkOp(); + + // Add some operations to be executed in order + batch.insert({ a: 1 }); + batch.insert({ a: 1 }); + + // Execute the operations + batch.execute(configuration.writeConcernMax(), (err, result) => { + expect(err).to.exist; + expect(result).to.not.exist; + + // Test basic settings + result = err.result; + expect(result.nInserted).to.equal(1); + expect(result.hasWriteErrors()).to.equal(true); + expect(result.getWriteErrorCount() === 1).to.equal(true); + + // Individual error checking + const error = result.getWriteErrorAt(0); + expect(error.code === 11000).to.equal(true); + expect(error.errmsg).to.exist; + expect(err.message).to.equal(error.errmsg); + + client.close(done); + }); + } + ); + }); + }); + it( 'should Correctly Execute Unordered Batch of with upserts causing duplicate key errors on updates', {