diff --git a/lib/internal/errors.js b/lib/internal/errors.js index 17b6f966d42357..3e940c8496874a 100644 --- a/lib/internal/errors.js +++ b/lib/internal/errors.js @@ -550,34 +550,33 @@ function exceptionWithHostPort(err, syscall, address, port, additional) { } /** - * @param {number|string} err - A libuv error number or a c-ares error code + * @param {number|string} code - A libuv error number or a c-ares error code * @param {string} syscall * @param {string} [hostname] * @returns {Error} */ -function dnsException(err, syscall, hostname) { - // eslint-disable-next-line no-restricted-syntax - const ex = new Error(); +function dnsException(code, syscall, hostname) { + let message; // FIXME(bnoordhuis) Remove this backwards compatibility nonsense and pass // the true error to the user. ENOTFOUND is not even a proper POSIX error! - if (err === UV_EAI_MEMORY || - err === UV_EAI_NODATA || - err === UV_EAI_NONAME) { - err = 'ENOTFOUND'; // Fabricated error name. + if (code === UV_EAI_MEMORY || + code === UV_EAI_NODATA || + code === UV_EAI_NONAME) { + code = 'ENOTFOUND'; // Fabricated error name. } - if (typeof err === 'string') { // c-ares error code. - const errHost = hostname ? ` ${hostname}` : ''; - ex.message = `${syscall} ${err}${errHost}`; - // TODO(joyeecheung): errno is supposed to be a number, like in uvException - ex.code = ex.errno = err; - ex.syscall = syscall; + if (typeof code === 'string') { // c-ares error code. + message = `${syscall} ${code}${hostname ? ` ${hostname}` : ''}`; } else { // libuv error number - const code = lazyInternalUtil().getSystemErrorName(err); - ex.message = `${syscall} ${code}`; - // TODO(joyeecheung): errno is supposed to be err, like in uvException - ex.code = ex.errno = code; - ex.syscall = syscall; + code = lazyInternalUtil().getSystemErrorName(code); + message = `${syscall} ${code}`; } + // eslint-disable-next-line no-restricted-syntax + const ex = new Error(message); + // TODO(joyeecheung): errno is supposed to be a number / err, like in + // uvException. + ex.errno = code; + ex.code = code; + ex.syscall = syscall; if (hostname) { ex.hostname = hostname; } diff --git a/test/common/index.js b/test/common/index.js index ba53065ef01d01..1a444f0dbd1b44 100644 --- a/test/common/index.js +++ b/test/common/index.js @@ -691,6 +691,9 @@ exports.expectsError = function expectsError(fn, settings, exact) { fn = undefined; } function innerFn(error) { + const descriptor = Object.getOwnPropertyDescriptor(error, 'message'); + assert.strictEqual(descriptor.enumerable, + false, 'The error message should be non-enumerable'); if ('type' in settings) { const type = settings.type; if (type !== Error && !Error.isPrototypeOf(type)) { diff --git a/test/parallel/test-dns-lookup.js b/test/parallel/test-dns-lookup.js index d006355742e55b..b9c0dfc6dff7a5 100644 --- a/test/parallel/test-dns-lookup.js +++ b/test/parallel/test-dns-lookup.js @@ -92,6 +92,9 @@ dns.lookup('example.com', common.mustCall((error, result, addressType) => { assert(error); assert.strictEqual(tickValue, 1); assert.strictEqual(error.code, 'ENOENT'); + const descriptor = Object.getOwnPropertyDescriptor(error, 'message'); + assert.strictEqual(descriptor.enumerable, + false, 'The error message should be non-enumerable'); })); // Make sure that the error callback is called diff --git a/test/parallel/test-dns-resolveany-bad-ancount.js b/test/parallel/test-dns-resolveany-bad-ancount.js index 25ce15935caad9..63ed1774b11933 100644 --- a/test/parallel/test-dns-resolveany-bad-ancount.js +++ b/test/parallel/test-dns-resolveany-bad-ancount.js @@ -30,6 +30,9 @@ server.bind(0, common.mustCall(() => { assert.strictEqual(err.code, 'EBADRESP'); assert.strictEqual(err.syscall, 'queryAny'); assert.strictEqual(err.hostname, 'example.org'); + const descriptor = Object.getOwnPropertyDescriptor(err, 'message'); + assert.strictEqual(descriptor.enumerable, + false, 'The error message should be non-enumerable'); server.close(); })); }));