Skip to content

Commit e902584

Browse files
fix(NODE-6276): preserve top level error code MongoWriteConcernError (#4183)
1 parent 9de03fd commit e902584

File tree

5 files changed

+54
-14
lines changed

5 files changed

+54
-14
lines changed

src/bulk/common.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -616,8 +616,8 @@ function handleMongoWriteConcernError(
616616
callback(
617617
new MongoBulkWriteError(
618618
{
619-
message: err.result?.writeConcernError.errmsg,
620-
code: err.result?.writeConcernError.result
619+
message: err.result.writeConcernError.errmsg,
620+
code: err.result.writeConcernError.code
621621
},
622622
new BulkWriteResult(bulkResult, isOrdered)
623623
)

src/error.ts

+20-11
Original file line numberDiff line numberDiff line change
@@ -1158,6 +1158,23 @@ export class MongoServerSelectionError extends MongoSystemError {
11581158
}
11591159
}
11601160

1161+
/**
1162+
* The type of the result property of MongoWriteConcernError
1163+
* @public
1164+
*/
1165+
export interface WriteConcernErrorResult {
1166+
writeConcernError: {
1167+
code: number;
1168+
errmsg: string;
1169+
codeName?: string;
1170+
errInfo?: Document;
1171+
};
1172+
ok: number;
1173+
code?: number;
1174+
errorLabels?: string[];
1175+
[x: string | number]: unknown;
1176+
}
1177+
11611178
/**
11621179
* An error thrown when the server reports a writeConcernError
11631180
* @public
@@ -1178,16 +1195,8 @@ export class MongoWriteConcernError extends MongoServerError {
11781195
*
11791196
* @public
11801197
**/
1181-
constructor(result: {
1182-
writeConcernError: {
1183-
code: number;
1184-
errmsg: string;
1185-
codeName?: string;
1186-
errInfo?: Document;
1187-
};
1188-
errorLabels?: string[];
1189-
}) {
1190-
super({ ...result, ...result.writeConcernError });
1198+
constructor(result: WriteConcernErrorResult) {
1199+
super({ ...result.writeConcernError, ...result });
11911200
this.errInfo = result.writeConcernError.errInfo;
11921201
this.result = result;
11931202
}
@@ -1237,7 +1246,7 @@ export function needsRetryableWriteLabel(error: Error, maxWireVersion: number):
12371246
}
12381247

12391248
if (error instanceof MongoWriteConcernError) {
1240-
return RETRYABLE_WRITE_ERROR_CODES.has(error.result?.code ?? error.code ?? 0);
1249+
return RETRYABLE_WRITE_ERROR_CODES.has(error.result.writeConcernError.code ?? error?.code ?? 0);
12411250
}
12421251

12431252
if (error instanceof MongoError && typeof error.code === 'number') {

src/index.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ export {
7373
MongoTopologyClosedError,
7474
MongoTransactionError,
7575
MongoUnexpectedServerResponseError,
76-
MongoWriteConcernError
76+
MongoWriteConcernError,
77+
WriteConcernErrorResult
7778
} from './error';
7879
export {
7980
AbstractCursor,

test/unit/error.test.ts

+29
Original file line numberDiff line numberDiff line change
@@ -740,4 +740,33 @@ describe('MongoErrors', () => {
740740
});
741741
});
742742
});
743+
744+
describe('MongoWriteConcernError constructor', function () {
745+
context('when no top-level code is provided', function () {
746+
it('error.code is set to writeConcernError.code', function () {
747+
const res = {
748+
writeConcernError: {
749+
code: 81, // nested code
750+
errmsg: 'fake msg'
751+
},
752+
ok: 1
753+
};
754+
expect(new MongoWriteConcernError(res).code).to.equal(81);
755+
});
756+
});
757+
context('when top-level code is provided and writeConcernError.code exists', function () {
758+
it('error.code equals the top-level code', function () {
759+
const topLevelCode = 10;
760+
const res = {
761+
writeConcernError: {
762+
code: 81, // nested code
763+
errmsg: 'fake msg'
764+
},
765+
ok: 1,
766+
code: topLevelCode
767+
};
768+
expect(new MongoWriteConcernError(res).code).to.equal(topLevelCode);
769+
});
770+
});
771+
});
743772
});

test/unit/index.test.ts

+1
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ const EXPECTED_EXPORTS = [
108108
'MongoTransactionError',
109109
'MongoUnexpectedServerResponseError',
110110
'MongoWriteConcernError',
111+
'WriteConcernErrorResult',
111112
'ObjectId',
112113
'OrderedBulkOperation',
113114
'ProfilingLevel',

0 commit comments

Comments
 (0)