Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
6712fbe
refactor(NODE-3337): unwrap-WriteConcernError
andymina Jul 29, 2021
992c3c7
refactor(NODE-3337): potential unwrapping solution
andymina Jul 30, 2021
2269004
refactor(NODE-3337): remove WriteConcernError wrapping
andymina Aug 2, 2021
d43977c
refactor(NODE-3337): update more instances of WriteConcernError
andymina Aug 3, 2021
01fc75b
refactor(NODE-3337): unwrap MongoBulkWriteError constructor
andymina Aug 4, 2021
4f38794
refactor(NODE-3337): unwrap WriteConcernError constructor
andymina Aug 4, 2021
0fc0bbf
refactor(NODE-3337): update MongoBulkWriteError constructor
andymina Aug 4, 2021
ce1ab0a
test(NODE-3337): fix ts definitions test
andymina Aug 6, 2021
fa88f86
refactor(NODE-3337): unwrap-WriteConcernError
andymina Jul 29, 2021
2f4e16e
refactor(NODE-3337): potential unwrapping solution
andymina Jul 30, 2021
e1ce12f
refactor(NODE-3337): remove WriteConcernError wrapping
andymina Aug 2, 2021
d6a7430
refactor(NODE-3337): update more instances of WriteConcernError
andymina Aug 3, 2021
3df81f1
refactor(NODE-3337): unwrap MongoBulkWriteError constructor
andymina Aug 4, 2021
d177f29
refactor(NODE-3337): unwrap WriteConcernError constructor
andymina Aug 4, 2021
d6cb94f
refactor(NODE-3337): update MongoBulkWriteError constructor
andymina Aug 4, 2021
759e6c6
test(NODE-3337): fix ts definitions test
andymina Aug 6, 2021
687e4a9
refactor(NODE-3337): add topologyVersion to MongoServerError
andymina Aug 6, 2021
b5616f5
refactor(NODE-3337): reintroduce loop in MongoServerError constructor
andymina Aug 6, 2021
7914e29
refactor(NODE-3404): prevent double work in MongoServerError constructor
andymina Aug 6, 2021
43e1acd
refactor(NODE-3337): revert MongoServerError constructor
andymina Aug 9, 2021
487c8b7
fix(NODE-3337): fix duplicate declaration typo
andymina Aug 9, 2021
eb5e0c1
refactor(NODE-3337): revert incorrect usage of MongoWriteConcernError
andymina Aug 9, 2021
d701150
docs(NODE-3337): add comment explaining MongoServerError usage
andymina Aug 10, 2021
430e8ec
refactor(NODE-3337): add symbol to WriteConcernError and revert Mongo…
andymina Aug 12, 2021
524ee39
refactor(NODE-3337): remove explicit props in WriteConcernError
andymina Aug 12, 2021
3015451
refactor(NODE-3337): add WriteConcernErrorData interface
andymina Aug 12, 2021
8b6ea51
style(NODE-3337): mark kServerError internal
andymina Aug 13, 2021
f5a1a7d
refactor(NODE-3337): inline return typeof toJSON
andymina Aug 16, 2021
3b6f491
refactor(NODE-3337): make WriteConcernErrorData public
andymina Aug 16, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 57 additions & 28 deletions src/bulk/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,10 @@ import type { Collection } from '../collection';
import type { Topology } from '../sdam/topology';
import type { CommandOperationOptions, CollationOptions } from '../operations/command';
import type { Hint } from '../operations/operation';
import type { Filter, OptionalId, UpdateFilter } from '../mongo_types';
import type { Filter, OneOrMore, OptionalId, UpdateFilter } from '../mongo_types';

/** @internal */
const kServerError = Symbol('serverError');

/** @public */
export const BatchType = Object.freeze({
Expand Down Expand Up @@ -309,9 +312,7 @@ export class BulkWriteResult {
if (i === 0) errmsg = errmsg + ' and ';
}

return new WriteConcernError(
new MongoServerError({ errmsg: errmsg, code: MONGODB_ERROR_CODES.WriteConcernFailed })
);
return new WriteConcernError({ errmsg, code: MONGODB_ERROR_CODES.WriteConcernFailed });
}
}

Expand All @@ -328,34 +329,52 @@ export class BulkWriteResult {
}
}

/** @public */
export interface WriteConcernErrorData {
code: number;
errmsg: string;
errInfo?: Document;
}

/**
* An error representing a failure by the server to apply the requested write concern to the bulk operation.
* @public
* @category Error
*/
export class WriteConcernError {
err: MongoServerError;
/** @internal */
[kServerError]: WriteConcernErrorData;

constructor(err: MongoServerError) {
this.err = err;
constructor(error: WriteConcernErrorData) {
this[kServerError] = error;
}

/** Write concern error code. */
get code(): number | undefined {
return this.err.code;
return this[kServerError].code;
}

/** Write concern error message. */
get errmsg(): string {
return this.err.errmsg;
get errmsg(): string | undefined {
return this[kServerError].errmsg;
}

/** Write concern error info. */
get errInfo(): Document | undefined {
return this[kServerError].errInfo;
}

/** @deprecated The `err` prop that contained a MongoServerError has been deprecated. */
get err(): WriteConcernErrorData {
return this[kServerError];
}

toJSON(): { code?: number; errmsg: string } {
return { code: this.err.code, errmsg: this.err.errmsg };
toJSON(): WriteConcernErrorData {
return this[kServerError];
}

toString(): string {
return `WriteConcernError(${this.err.errmsg})`;
return `WriteConcernError(${this.errmsg})`;
}
}

Expand Down Expand Up @@ -656,17 +675,12 @@ function handleMongoWriteConcernError(
) {
mergeBatchResults(batch, bulkResult, undefined, err.result);

// TODO: Remove multiple levels of wrapping (NODE-3337)
const wrappedWriteConcernError = new WriteConcernError(
new MongoServerError({
errmsg: err.result?.writeConcernError.errmsg,
code: err.result?.writeConcernError.result
})
);

callback(
new MongoBulkWriteError(
new MongoServerError(wrappedWriteConcernError),
{
message: err.result?.writeConcernError.errmsg,
code: err.result?.writeConcernError.result
},
new BulkWriteResult(bulkResult)
)
);
Expand All @@ -679,13 +693,28 @@ function handleMongoWriteConcernError(
*/
export class MongoBulkWriteError extends MongoServerError {
result: BulkWriteResult;
writeErrors: OneOrMore<WriteError> = [];
err?: WriteConcernError;

/** Creates a new MongoBulkWriteError */
constructor(error: AnyError, result: BulkWriteResult) {
super(error as Error);
Object.assign(this, error);
constructor(
error:
| { message: string; code: number; writeErrors?: WriteError[] }
| WriteConcernError
| AnyError,
result: BulkWriteResult
) {
super(error);

if (error instanceof WriteConcernError) this.err = error;
else if (!(error instanceof Error)) {
this.message = error.message;
this.code = error.code;
this.writeErrors = error.writeErrors ?? [];
}

this.result = result;
Object.assign(this, error);
}

get name(): string {
Expand Down Expand Up @@ -1225,11 +1254,11 @@ export abstract class BulkOperationBase {

callback(
new MongoBulkWriteError(
new MongoServerError({
{
message: msg,
code: this.s.bulkResult.writeErrors[0].code,
writeErrors: this.s.bulkResult.writeErrors
}),
},
writeResult
)
);
Expand All @@ -1239,7 +1268,7 @@ export abstract class BulkOperationBase {

const writeConcernError = writeResult.getWriteConcernError();
if (writeConcernError) {
callback(new MongoBulkWriteError(new MongoServerError(writeConcernError), writeResult));
callback(new MongoBulkWriteError(writeConcernError, writeResult));
return true;
}
}
Expand Down
38 changes: 18 additions & 20 deletions src/error.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,12 +60,12 @@ export const GET_MORE_RESUMABLE_CODES = new Set<number>([
]);

/** @public */
export interface ErrorDescription {
export interface ErrorDescription extends Document {
message?: string;
errmsg?: string;
$err?: string;
errorLabels?: string[];
[key: string]: any;
errInfo?: Document;
}

/**
Expand All @@ -84,7 +84,6 @@ export class MongoError extends Error {
constructor(message: string | Error) {
if (message instanceof Error) {
super(message.message);
this.stack = message.stack;
} else {
super(message);
}
Expand Down Expand Up @@ -136,23 +135,20 @@ export class MongoServerError extends MongoError {
code?: number;
codeName?: string;
writeConcernError?: Document;
errInfo?: Document;
ok?: number;
topologyVersion?: TopologyVersion;
[key: string]: any;

constructor(message: Error | ErrorDescription) {
if (message instanceof Error) {
super(message);
} else {
super(message.message || message.errmsg || message.$err || 'n/a');
if (message.errorLabels) {
this[kErrorLabels] = new Set(message.errorLabels);
}

for (const name in message) {
if (name === 'errorLabels' || name === 'errmsg' || name === 'message') {
continue;
}

(this as any)[name] = message[name];
}
constructor(message: ErrorDescription) {
super(message.message || message.errmsg || message.$err || 'n/a');
if (message.errorLabels) {
this[kErrorLabels] = new Set(message.errorLabels);
}

for (const name in message) {
if (name !== 'errorLabels' && name !== 'errmsg' && name !== 'message')
this[name] = message[name];
}
}

Expand Down Expand Up @@ -682,13 +678,15 @@ function makeWriteConcernResultObject(input: any) {
export class MongoWriteConcernError extends MongoServerError {
/** The result document (provided if ok: 1) */
result?: Document;
errInfo?: Document;

constructor(message: ErrorDescription, result: Document) {
constructor(message: ErrorDescription, result?: Document) {
if (result && Array.isArray(result.errorLabels)) {
message.errorLabels = result.errorLabels;
}

super(message);
this.errInfo = message.errInfo;

if (result != null) {
this.result = makeWriteConcernResultObject(result);
Expand Down
8 changes: 7 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -360,7 +360,13 @@ export type {
export type { W, WriteConcernOptions, WriteConcernSettings } from './write_concern';
export type { ExecutionResult } from './operations/execute_operation';
export type { InternalAbstractCursorOptions } from './cursor/abstract_cursor';
export type { BulkOperationBase, BulkOperationPrivate, FindOperators, Batch } from './bulk/common';
export type {
BulkOperationBase,
BulkOperationPrivate,
FindOperators,
Batch,
WriteConcernErrorData
} from './bulk/common';
export type { OrderedBulkOperation } from './bulk/ordered';
export type { UnorderedBulkOperation } from './bulk/unordered';
export type { Encrypter, EncrypterOptions } from './encrypter';
Expand Down
5 changes: 4 additions & 1 deletion src/operations/insert.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,10 @@ export class InsertOneOperation extends InsertOperation {
super.execute(server, session, (err, res) => {
if (err || res == null) return callback(err);
if (res.code) return callback(new MongoServerError(res));
if (res.writeErrors) return callback(new MongoServerError(res.writeErrors[0]));
if (res.writeErrors) {
// This should be a WriteError but we can't change it now because of error hierarchy
return callback(new MongoServerError(res.writeErrors[0]));
}

callback(undefined, {
acknowledged: this.writeConcern?.w !== 0 ?? true,
Expand Down
3 changes: 1 addition & 2 deletions test/unit/core/write_concern_error.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,10 @@
const { Topology } = require('../../../src/sdam/topology');
const mock = require('../../tools/mock');
const { ReplSetFixture } = require('./common');
const { MongoWriteConcernError } = require('../../../src/error');
const { MongoServerError, MongoWriteConcernError } = require('../../../src/error');
const { expect } = require('chai');
const { ns } = require('../../../src/utils');
const { once } = require('events');
const { MongoServerError } = require('../../../src');

describe('WriteConcernError', function () {
let test;
Expand Down