Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
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
1 change: 1 addition & 0 deletions global.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ declare global {
serverless?: 'forbid' | 'allow' | 'require';
auth?: 'enabled' | 'disabled';
idmsMockServer?: true;
nodejs?: string;
};

sessions?: {
Expand Down
18 changes: 17 additions & 1 deletion src/error.ts
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,16 @@ export interface ErrorDescription extends Document {
errInfo?: Document;
}

function isAggregateError(e: unknown): e is Error & { errors: Error[] } {
return (
typeof e === 'object' &&
e != null &&
e instanceof Error &&
'errors' in e &&
Array.isArray(e.errors)
);
}

/**
* @public
* @category Error
Expand All @@ -132,7 +142,13 @@ export class MongoError extends Error {

constructor(message: string | Error) {
if (message instanceof Error) {
super(message.message);
if (isAggregateError(message)) {
const combinedMessage = 'Aggregate Error: ' + message.errors.map(e => e.message).join(', ');
super(combinedMessage);
} else {
super(message.message);
}

this.cause = message;
} else {
super(message);
Expand Down
40 changes: 40 additions & 0 deletions test/integration/node-specific/errors.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { expect } from 'chai';

import { MongoClient, MongoError } from '../../mongodb';

describe('Error (Integration)', function () {
describe('AggregateErrors', function () {
it('constructs the message properly', { requires: { nodejs: '>=16' } }, () => {
for (const { errors, message } of [
{ errors: [], message: 'Aggregate Error: ' },
{ errors: [new Error('message 1')], message: 'Aggregate Error: message 1' },
{
errors: [new Error('message 1'), new Error('message 2')],
message: 'Aggregate Error: message 1, message 2'
}
]) {
const error = new AggregateError(errors);
const mongoError = new MongoError(error);

expect(
mongoError.message,
`built the message properly with an array of ${errors.length} errors`
).to.equal(message);
}
});

it('sets the aggregate error to the cause property', { requires: { nodejs: '>=16' } }, () => {
const error = new AggregateError([new Error('error 1')]);
const mongoError = new MongoError(error);
expect(mongoError.cause).to.equal(error);
});
});

it('NODE-5296: handles aggregate errors from dns lookup', async function () {
const error = await MongoClient.connect('mongodb://localhost:27222', {
serverSelectionTimeoutMS: 1000
}).catch(e => e);
expect(error).to.be.instanceOf(Error);
expect(error.message).to.match(/ECONNREFUSED/);
});
});
26 changes: 26 additions & 0 deletions test/tools/runner/filters/node_version_filter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
'use strict';

const { satisfies } = require('semver');

/**
* Filter for specific nodejs versions
*
* example:
* metadata: {
* requires: {
* nodejs: '>=14'
* }
* }
*/
class NodeVersionFilter {
filter(test) {
const nodeVersionRange = test?.metadata?.requires?.nodejs;
if (!nodeVersionRange) {
return true;
}

return satisfies(process.version, nodeVersionRange);
}
}

module.exports = NodeVersionFilter;