@@ -26,7 +26,10 @@ import type { Collection } from '../collection';
26
26
import type { Topology } from '../sdam/topology' ;
27
27
import type { CommandOperationOptions , CollationOptions } from '../operations/command' ;
28
28
import 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' ) ;
30
33
31
34
/** @public */
32
35
export const BatchType = Object . freeze ( {
@@ -309,9 +312,7 @@ export class BulkWriteResult {
309
312
if ( i === 0 ) errmsg = errmsg + ' and ' ;
310
313
}
311
314
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 } ) ;
315
316
}
316
317
}
317
318
@@ -328,34 +329,52 @@ export class BulkWriteResult {
328
329
}
329
330
}
330
331
332
+ /** @public */
333
+ export interface WriteConcernErrorData {
334
+ code : number ;
335
+ errmsg : string ;
336
+ errInfo ?: Document ;
337
+ }
338
+
331
339
/**
332
340
* An error representing a failure by the server to apply the requested write concern to the bulk operation.
333
341
* @public
334
342
* @category Error
335
343
*/
336
344
export class WriteConcernError {
337
- err : MongoServerError ;
345
+ /** @internal */
346
+ [ kServerError ] : WriteConcernErrorData ;
338
347
339
- constructor ( err : MongoServerError ) {
340
- this . err = err ;
348
+ constructor ( error : WriteConcernErrorData ) {
349
+ this [ kServerError ] = error ;
341
350
}
342
351
343
352
/** Write concern error code. */
344
353
get code ( ) : number | undefined {
345
- return this . err . code ;
354
+ return this [ kServerError ] . code ;
346
355
}
347
356
348
357
/** 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 ] ;
351
370
}
352
371
353
- toJSON ( ) : { code ?: number ; errmsg : string } {
354
- return { code : this . err . code , errmsg : this . err . errmsg } ;
372
+ toJSON ( ) : WriteConcernErrorData {
373
+ return this [ kServerError ] ;
355
374
}
356
375
357
376
toString ( ) : string {
358
- return `WriteConcernError(${ this . err . errmsg } )` ;
377
+ return `WriteConcernError(${ this . errmsg } )` ;
359
378
}
360
379
}
361
380
@@ -656,17 +675,12 @@ function handleMongoWriteConcernError(
656
675
) {
657
676
mergeBatchResults ( batch , bulkResult , undefined , err . result ) ;
658
677
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
-
667
678
callback (
668
679
new MongoBulkWriteError (
669
- new MongoServerError ( wrappedWriteConcernError ) ,
680
+ {
681
+ message : err . result ?. writeConcernError . errmsg ,
682
+ code : err . result ?. writeConcernError . result
683
+ } ,
670
684
new BulkWriteResult ( bulkResult )
671
685
)
672
686
) ;
@@ -679,13 +693,28 @@ function handleMongoWriteConcernError(
679
693
*/
680
694
export class MongoBulkWriteError extends MongoServerError {
681
695
result : BulkWriteResult ;
696
+ writeErrors : OneOrMore < WriteError > = [ ] ;
697
+ err ?: WriteConcernError ;
682
698
683
699
/** 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
+ }
687
715
688
716
this . result = result ;
717
+ Object . assign ( this , error ) ;
689
718
}
690
719
691
720
get name ( ) : string {
@@ -1225,11 +1254,11 @@ export abstract class BulkOperationBase {
1225
1254
1226
1255
callback (
1227
1256
new MongoBulkWriteError (
1228
- new MongoServerError ( {
1257
+ {
1229
1258
message : msg ,
1230
1259
code : this . s . bulkResult . writeErrors [ 0 ] . code ,
1231
1260
writeErrors : this . s . bulkResult . writeErrors
1232
- } ) ,
1261
+ } ,
1233
1262
writeResult
1234
1263
)
1235
1264
) ;
@@ -1239,7 +1268,7 @@ export abstract class BulkOperationBase {
1239
1268
1240
1269
const writeConcernError = writeResult . getWriteConcernError ( ) ;
1241
1270
if ( writeConcernError ) {
1242
- callback ( new MongoBulkWriteError ( new MongoServerError ( writeConcernError ) , writeResult ) ) ;
1271
+ callback ( new MongoBulkWriteError ( writeConcernError , writeResult ) ) ;
1243
1272
return true ;
1244
1273
}
1245
1274
}
0 commit comments