Skip to content

Commit 7aa3567

Browse files
authored
fix: make MongoBulkWriteError conform to CRUD spec (#2621)
`BulkWriteError` has been renamed to `MongoBulkWriteError`, and the class has new properties that make it compliant with spec tests. NODE-1989
1 parent bb1e081 commit 7aa3567

File tree

3 files changed

+38
-51
lines changed

3 files changed

+38
-51
lines changed

src/bulk/common.ts

+37-9
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,9 @@ function executeCommands(
551551
function resultHandler(err?: AnyError, result?: Document) {
552552
// Error is a driver related error not a bulk op error, return early
553553
if (err && 'message' in err && !(err instanceof MongoWriteConcernError)) {
554-
return callback(new BulkWriteError(err, new BulkWriteResult(bulkOperation.s.bulkResult)));
554+
return callback(
555+
new MongoBulkWriteError(err, new BulkWriteResult(bulkOperation.s.bulkResult))
556+
);
555557
}
556558

557559
if (err instanceof MongoWriteConcernError) {
@@ -651,7 +653,10 @@ function handleMongoWriteConcernError(
651653
);
652654

653655
callback(
654-
new BulkWriteError(new MongoError(wrappedWriteConcernError), new BulkWriteResult(bulkResult))
656+
new MongoBulkWriteError(
657+
new MongoError(wrappedWriteConcernError),
658+
new BulkWriteResult(bulkResult)
659+
)
655660
);
656661
}
657662

@@ -660,16 +665,39 @@ function handleMongoWriteConcernError(
660665
* @public
661666
* @category Error
662667
*/
663-
export class BulkWriteError extends MongoError {
664-
result?: BulkWriteResult;
668+
export class MongoBulkWriteError extends MongoError {
669+
result: BulkWriteResult;
665670

666-
/** Creates a new BulkWriteError */
667-
constructor(error?: AnyError, result?: BulkWriteResult) {
671+
/** Number of documents inserted. */
672+
insertedCount: number;
673+
/** Number of documents matched for update. */
674+
matchedCount: number;
675+
/** Number of documents modified. */
676+
modifiedCount: number;
677+
/** Number of documents deleted. */
678+
deletedCount: number;
679+
/** Number of documents upserted. */
680+
upsertedCount: number;
681+
/** Inserted document generated Id's, hash key is the index of the originating operation */
682+
insertedIds: { [key: number]: ObjectId };
683+
/** Upserted document generated Id's, hash key is the index of the originating operation */
684+
upsertedIds: { [key: number]: ObjectId };
685+
686+
/** Creates a new MongoBulkWriteError */
687+
constructor(error: AnyError, result: BulkWriteResult) {
668688
super(error as Error);
669689
Object.assign(this, error);
670690

671-
this.name = 'BulkWriteError';
691+
this.name = 'MongoBulkWriteError';
672692
this.result = result;
693+
694+
this.insertedCount = result.insertedCount;
695+
this.matchedCount = result.matchedCount;
696+
this.modifiedCount = result.modifiedCount;
697+
this.deletedCount = result.deletedCount;
698+
this.upsertedCount = result.upsertedCount;
699+
this.insertedIds = result.insertedIds;
700+
this.upsertedIds = result.upsertedIds;
673701
}
674702
}
675703

@@ -1214,7 +1242,7 @@ export abstract class BulkOperationBase {
12141242
: 'write operation failed';
12151243

12161244
callback(
1217-
new BulkWriteError(
1245+
new MongoBulkWriteError(
12181246
new MongoError({
12191247
message: msg,
12201248
code: this.s.bulkResult.writeErrors[0].code,
@@ -1229,7 +1257,7 @@ export abstract class BulkOperationBase {
12291257

12301258
const writeConcernError = writeResult.getWriteConcernError();
12311259
if (writeConcernError) {
1232-
callback(new BulkWriteError(new MongoError(writeConcernError), writeResult));
1260+
callback(new MongoBulkWriteError(new MongoError(writeConcernError), writeResult));
12331261
return true;
12341262
}
12351263
}

src/index.ts

+1-5
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,7 @@ export {
5757
MongoParseError,
5858
MongoWriteConcernError
5959
} from './error';
60-
export {
61-
BulkWriteError as MongoBulkWriteError,
62-
BulkWriteOptions,
63-
AnyBulkWriteOperation
64-
} from './bulk/common';
60+
export { MongoBulkWriteError, BulkWriteOptions, AnyBulkWriteOperation } from './bulk/common';
6561
export {
6662
// Utils
6763
instrument,

test/functional/crud_spec.test.js

-37
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ const chai = require('chai');
66
const expect = chai.expect;
77
chai.use(require('chai-subset'));
88

9-
const BulkWriteError = require('../../src/bulk/common').BulkWriteError;
10-
119
const TestRunnerContext = require('./spec-runner').TestRunnerContext;
1210
const gatherTestSuites = require('./spec-runner').gatherTestSuites;
1311
const generateTopologyTests = require('./spec-runner').generateTopologyTests;
@@ -111,36 +109,6 @@ describe('CRUD spec', function () {
111109
});
112110
});
113111

114-
function transformBulkWriteResult(result) {
115-
const r = {};
116-
r.insertedCount = result.nInserted;
117-
r.matchedCount = result.nMatched;
118-
r.modifiedCount = result.nModified || 0;
119-
r.deletedCount = result.nRemoved;
120-
r.upsertedCount = result.getUpsertedIds().length;
121-
r.upsertedIds = {};
122-
r.insertedIds = {};
123-
124-
// Update the n
125-
r.n = r.insertedCount;
126-
127-
// Inserted documents
128-
const inserted = result.getInsertedIds();
129-
// Map inserted ids
130-
for (let i = 0; i < inserted.length; i++) {
131-
r.insertedIds[inserted[i].index] = inserted[i]._id;
132-
}
133-
134-
// Upserted documents
135-
const upserted = result.getUpsertedIds();
136-
// Map upserted ids
137-
for (let i = 0; i < upserted.length; i++) {
138-
r.upsertedIds[upserted[i].index] = upserted[i]._id;
139-
}
140-
141-
return r;
142-
}
143-
144112
function invert(promise) {
145113
return promise.then(
146114
() => {
@@ -152,11 +120,6 @@ describe('CRUD spec', function () {
152120

153121
function assertWriteExpectations(collection, outcome) {
154122
return function (result) {
155-
// TODO: when we fix our bulk write errors, get rid of this
156-
if (result instanceof BulkWriteError) {
157-
result = transformBulkWriteResult(result.result);
158-
}
159-
160123
Object.keys(outcome.result).forEach(resultName => {
161124
expect(result).to.have.property(resultName);
162125
if (resultName === 'upsertedId') {

0 commit comments

Comments
 (0)