@@ -26,7 +26,10 @@ import type { Collection } from '../collection';
2626import type { Topology } from '../sdam/topology' ;
2727import type { CommandOperationOptions , CollationOptions } from '../operations/command' ;
2828import type { Hint } from '../operations/operation' ;
29- import type { Filter , OptionalId , UpdateFilter } from '../mongo_types' ;
29+ import type { Filter , OneOrMore , OptionalId , UpdateFilter } from '../mongo_types' ;
30+
31+ /** @internal */
32+ const kServerError = Symbol ( 'serverError' ) ;
3033
3134/** @public */
3235export const BatchType = Object . freeze ( {
@@ -309,9 +312,7 @@ export class BulkWriteResult {
309312 if ( i === 0 ) errmsg = errmsg + ' and ' ;
310313 }
311314
312- return new WriteConcernError (
313- new MongoServerError ( { errmsg : errmsg , code : MONGODB_ERROR_CODES . WriteConcernFailed } )
314- ) ;
315+ return new WriteConcernError ( { errmsg, code : MONGODB_ERROR_CODES . WriteConcernFailed } ) ;
315316 }
316317 }
317318
@@ -328,34 +329,52 @@ export class BulkWriteResult {
328329 }
329330}
330331
332+ /** @public */
333+ export interface WriteConcernErrorData {
334+ code : number ;
335+ errmsg : string ;
336+ errInfo ?: Document ;
337+ }
338+
331339/**
332340 * An error representing a failure by the server to apply the requested write concern to the bulk operation.
333341 * @public
334342 * @category Error
335343 */
336344export class WriteConcernError {
337- err : MongoServerError ;
345+ /** @internal */
346+ [ kServerError ] : WriteConcernErrorData ;
338347
339- constructor ( err : MongoServerError ) {
340- this . err = err ;
348+ constructor ( error : WriteConcernErrorData ) {
349+ this [ kServerError ] = error ;
341350 }
342351
343352 /** Write concern error code. */
344353 get code ( ) : number | undefined {
345- return this . err . code ;
354+ return this [ kServerError ] . code ;
346355 }
347356
348357 /** Write concern error message. */
349- get errmsg ( ) : string {
350- return this . err . errmsg ;
358+ get errmsg ( ) : string | undefined {
359+ return this [ kServerError ] . errmsg ;
360+ }
361+
362+ /** Write concern error info. */
363+ get errInfo ( ) : Document | undefined {
364+ return this [ kServerError ] . errInfo ;
365+ }
366+
367+ /** @deprecated The `err` prop that contained a MongoServerError has been deprecated. */
368+ get err ( ) : WriteConcernErrorData {
369+ return this [ kServerError ] ;
351370 }
352371
353- toJSON ( ) : { code ?: number ; errmsg : string } {
354- return { code : this . err . code , errmsg : this . err . errmsg } ;
372+ toJSON ( ) : WriteConcernErrorData {
373+ return this [ kServerError ] ;
355374 }
356375
357376 toString ( ) : string {
358- return `WriteConcernError(${ this . err . errmsg } )` ;
377+ return `WriteConcernError(${ this . errmsg } )` ;
359378 }
360379}
361380
@@ -656,17 +675,12 @@ function handleMongoWriteConcernError(
656675) {
657676 mergeBatchResults ( batch , bulkResult , undefined , err . result ) ;
658677
659- // TODO: Remove multiple levels of wrapping (NODE-3337)
660- const wrappedWriteConcernError = new WriteConcernError (
661- new MongoServerError ( {
662- errmsg : err . result ?. writeConcernError . errmsg ,
663- code : err . result ?. writeConcernError . result
664- } )
665- ) ;
666-
667678 callback (
668679 new MongoBulkWriteError (
669- new MongoServerError ( wrappedWriteConcernError ) ,
680+ {
681+ message : err . result ?. writeConcernError . errmsg ,
682+ code : err . result ?. writeConcernError . result
683+ } ,
670684 new BulkWriteResult ( bulkResult )
671685 )
672686 ) ;
@@ -679,13 +693,28 @@ function handleMongoWriteConcernError(
679693 */
680694export class MongoBulkWriteError extends MongoServerError {
681695 result : BulkWriteResult ;
696+ writeErrors : OneOrMore < WriteError > = [ ] ;
697+ err ?: WriteConcernError ;
682698
683699 /** Creates a new MongoBulkWriteError */
684- constructor ( error : AnyError , result : BulkWriteResult ) {
685- super ( error as Error ) ;
686- Object . assign ( this , error ) ;
700+ constructor (
701+ error :
702+ | { message : string ; code : number ; writeErrors ?: WriteError [ ] }
703+ | WriteConcernError
704+ | AnyError ,
705+ result : BulkWriteResult
706+ ) {
707+ super ( error ) ;
708+
709+ if ( error instanceof WriteConcernError ) this . err = error ;
710+ else if ( ! ( error instanceof Error ) ) {
711+ this . message = error . message ;
712+ this . code = error . code ;
713+ this . writeErrors = error . writeErrors ?? [ ] ;
714+ }
687715
688716 this . result = result ;
717+ Object . assign ( this , error ) ;
689718 }
690719
691720 get name ( ) : string {
@@ -1225,11 +1254,11 @@ export abstract class BulkOperationBase {
12251254
12261255 callback (
12271256 new MongoBulkWriteError (
1228- new MongoServerError ( {
1257+ {
12291258 message : msg ,
12301259 code : this . s . bulkResult . writeErrors [ 0 ] . code ,
12311260 writeErrors : this . s . bulkResult . writeErrors
1232- } ) ,
1261+ } ,
12331262 writeResult
12341263 )
12351264 ) ;
@@ -1239,7 +1268,7 @@ export abstract class BulkOperationBase {
12391268
12401269 const writeConcernError = writeResult . getWriteConcernError ( ) ;
12411270 if ( writeConcernError ) {
1242- callback ( new MongoBulkWriteError ( new MongoServerError ( writeConcernError ) , writeResult ) ) ;
1271+ callback ( new MongoBulkWriteError ( writeConcernError , writeResult ) ) ;
12431272 return true ;
12441273 }
12451274 }
0 commit comments