Latest in branch 15.x
15.14.0
Released 06 Apr 2021
(5 years ago)
SoftwareNode.js
Version15.x
Status
End of life
Initial release15.0.0
20 Oct 2020
(5 years ago)
Latest release15.14.0
06 Apr 2021
(5 years ago)
End of bug fixes01 Jun 2021
(Ended 4 years, 11 months ago)
End of security fixes01 Jun 2021
(Ended 4 years, 11 months ago)
Release noteshttps://github.com/nodejs/node/releases/tag/v15.14.0
Source codehttps://github.com/nodejs/node/tree/v15.14.0
Documentationhttps://nodejs.org/dist/latest-v15.x/docs/api/
Downloadhttps://nodejs.org/download/release/latest-v15.x/
Node.js 15.x ReleasesView full list

What Is New in Node.js 15?

CategoryChange
New Featuresnpm 7 bundled
New FeaturesUnhandled promise rejections now throw by default
New FeaturesV8 8.6 -- logical assignment operators, Promise.any, String.replaceAll
ImprovementsQUIC (experimental) network protocol support
ImprovementsAbortController (experimental) added
Improvementscrypto: experimental Web Crypto API added
Deprecated--unhandled-rejections=throw no longer needed (it is now the default)

Unhandled Promise Rejections Now Crash the Process

In Node.js 15, an unhandled promise rejection terminates the process with a non-zero exit code by default. Previously this was a warning. This is the most impactful breaking change in v15 and affects any code where rejected promises are not caught.

// This will now CRASH the process in Node.js 15+
async function fail() {
  throw new Error('oops');
}
fail(); // no await, no .catch() -- EXIT 1

// Fix: always handle rejections
fail().catch(console.error);
// or:
process.on('unhandledRejection', (err) => { /* log + exit */ });

This forces better error handling discipline but will expose existing bugs in codebases that silently ignored rejected promises.

String.replaceAll() and Promise.any()

String.prototype.replaceAll() replaces all occurrences of a substring without a regex. Promise.any() resolves as soon as the first promise in the iterable fulfills -- the inverse of Promise.race() for success cases.

// No more regex for global replace
'foo-bar-baz'.replaceAll('-', '_'); // 'foo_bar_baz'

// First successful result
const result = await Promise.any([fetchA(), fetchB(), fetchC()]);

Logical Assignment Operators

Three new operators landed: &&=, ||=, and ??=. They combine logical evaluation with assignment, reducing boilerplate for common patterns like setting defaults.

let config = { retries: null };
config.retries ??= 3;       // sets to 3 because null
config.timeout ||= 5000;    // sets to 5000 because falsy
config.debug &&= verbose;   // assigns verbose only if config.debug is truthy

Experimental Web Crypto API

The Web Cryptography API (globalThis.crypto) lands experimentally in Node.js 15. You can use it to generate keys, sign data, hash values, and derive secrets using the same API as browsers -- without importing node:crypto.

FAQ

Will existing code break from the unhandled rejection change?
Only if you have promises that reject without a .catch() handler or await in a try/catch. Run your test suite on Node.js 15 first -- unhandled rejections that were previously warnings will now cause test failures.

Is QUIC ready to use in Node.js 15?
No -- QUIC is marked experimental. The implementation was incomplete at v15 and later removed from core in subsequent versions. Do not use it in production.

Does Promise.any() throw if all promises reject?
Yes, it throws an AggregateError containing all the individual errors. You can inspect err.errors to see each rejection reason.

Is Node.js 15 an LTS version?
No. Node.js 15 reached end-of-life in June 2022. Migrate to Node.js 18 LTS or Node.js 20 LTS.

How do I suppress unhandled rejection exits temporarily during debugging?
Start Node.js with --unhandled-rejections=warn to revert to the old warning-only behavior. This is useful when debugging without full promise coverage in test environments.

Releases In Branch 15.x

VersionRelease datenpm version
15.14.006 Apr 2021
(5 years ago)
7.7.6
15.13.031 Mar 2021
(5 years ago)
7.7.6
15.12.017 Mar 2021
(5 years ago)
7.6.3
15.11.003 Mar 2021
(5 years ago)
7.6.0
15.10.023 Feb 2021
(5 years ago)
7.5.3
15.9.018 Feb 2021
(5 years ago)
7.5.3
15.8.002 Feb 2021
(5 years ago)
7.5.1
15.7.025 Jan 2021
(5 years ago)
7.4.3
15.6.014 Jan 2021
(5 years ago)
7.4.0
15.5.104 Jan 2021
(5 years ago)
7.3.0
15.5.022 Dec 2020
(5 years ago)
7.3.0
15.4.009 Dec 2020
(5 years ago)
7.0.15
15.3.024 Nov 2020
(5 years ago)
7.0.14
15.2.116 Nov 2020
(5 years ago)
7.0.8
15.2.010 Nov 2020
(5 years ago)
7.0.8
15.1.004 Nov 2020
(5 years ago)
7.0.8
15.0.121 Oct 2020
(5 years ago)
7.0.3
15.0.020 Oct 2020
(5 years ago)
7.0.2