express
5.3.0 · 9 Oct 2026MIT87.4M / weekRepositoryHomepagenpmAtom feed
247 stable releases, newest first, by release line. Notes are quoted as the maintainers published them.
- 5.x · latest line
5.3.0
9 Oct 2026- security
Upgrade
qsto^6.16.0, which fixes CVE-2026-2391 (GHSA-w7fw-mjwx-w883), CVE-2026-82417 (GHSA-4mjr-xmp4-gh2g) and CVE-2026-82562 (GHSA-x5fp-wj9c-mxmx):arrayLimitbypasses in comma parsing and a denial of service via an attacker-controlledisBuffer - security
Upgrade
proxy-addrto^2.0.8, which fixes CVE-2026-90711 - security
Upgrade
body-parserto^2.3.0, which fixes CVE-2026-12590 (GHSA-v422-hmwv-36x6): an invalidlimitoption value caused request body size enforcement to be silently disabled (fail-open), allowing a denial of service via arbitrarily large payloads. Invalidlimitvalues now throw at parser initialization instead of being ignored
Highlights
Bug fixes
Fixed HTTP header conflict between Content-Length and Transfer-Encoding in res.send
Fixed the behavior of
res.send()to prevent conflicts betweenContent-LengthandTransfer-EncodingHTTP headers in responses. TheContent-Lengthheader inres.send()is now only added when aTransfer-Encodingheader is not present, complying with the HTTP specification that states both headers should not coexist in the same response. ETag generation is unaffected by the presence of aTransfer-Encodingheader
- security
Upgrade
qsto^6.16.0, which fixes CVE-2026-2391 (GHSA-w7fw-mjwx-w883), CVE-2026-82417 (GHSA-4mjr-xmp4-gh2g) and CVE-2026-82562 (GHSA-x5fp-wj9c-mxmx):arrayLimitbypasses in comma parsing and a denial of service via an attacker-controlledisBuffer - security
Upgrade
proxy-addrto^2.0.8, which fixes CVE-2026-90711
Improvements
Allow conditional revalidation for QUERY requests.
req.freshpreviously only validated freshness for GET and HEAD requests, so QUERY responses never returned 304 despite a matching validator. Since QUERY is a safe, idempotent, and cacheable method that supports conditional requests, it is now included in the freshness check// QUERY /reports with If-None-Match: "12345" app.query('/reports', (req, res) => { res.set('ETag', '"12345"'); res.send(results); // now responds 304 Not Modified });Improve HTML structure in
res.redirect()responses when HTML format is accepted by adding<!DOCTYPE html>,<title>, and<body>tags for better browser compatibilityWhen calling
app.renderwith options set to null, the locals object is handled correctly, preventing unexpected errors and making the method behave the same as when options is omitted or an empty object is passed - by AkaHarshitapp.render('index', null, callback); // now works as expectedUpgrade
content-typeto^2.0.0, bringing a faster parser (~1.5x quickerContent-Typeparsing/formatting inres.send()) along with a behavior change:res.send()now keeps any existing parameters when adding the charset and no longer throws on aContent-Typethat fails to parse.type-isis upgraded to^2.1.0as part of the same changeres.set('Content-Type', 'text/plain; foo=bar').send('hey'); // -> Content-Type: text/plain; foo=bar; charset=utf-8The default error handler now logs the full error object instead of only its stack trace, so nested details such as
Error.causeand library-specific properties (e.g. Sequelize'sparent/original) are no longer swallowedUpgrade
content-dispositionto^2.0.1, which changes theContent-Dispositionheader emitted byres.download(),res.attachment(), andres.sendFile(): file names that are valid HTTP tokens are no longer wrapped in quotes. This is equivalent per RFC 6266, but applications asserting on the exact header bytes should update their expectationsres.attachment('user.html'); // before -> Content-Disposition: attachment; filename="user.html" // after -> Content-Disposition: attachment; filename=user.html- security
Upgrade
body-parserto^2.3.0, which fixes CVE-2026-12590 (GHSA-v422-hmwv-36x6): an invalidlimitoption value caused request body size enforcement to be silently disabled (fail-open), allowing a denial of service via arbitrarily large payloads. Invalidlimitvalues now throw at parser initialization instead of being ignored
Performance
Avoid duplicate Content-Type header processing in
res.send()when sending string responses without an explicit Content-Type header
What's Changed
📝 add note to history
enhance req.acceptsCharsets method
nominate @krzysdz to triage team
Polish HTML structure of the response in the res.redirect() function
do not modify the Content-Type twice when sending strings
Allow passing null or undefined as the value for options in app.render
search example to support Redis v4+ and Express 4/5
Remove duplicate tests in res.location and res.jsonp
- security
bump qs minimum to ^6.14.2 for CVE-2026-2391
include edge case tests for
res.type()update deprecated npm install docs URL in Readme.md
fixed typo in history.md
bump qs minimum to 6.15.2
Upgrade
content-typeImprove error logging by logging full error object
replace deprecated trimRight() with trimEnd()
Upgrade
content-dispositionres.send: add Content-Length header only if Transfer-Encoding is not present
allow conditional revalidation for QUERY requests
res.send: preserve ETag generation with Transfer-Encoding
5.2.1
1 Dec 2025Reading the note…
5.2.0
1 Dec 2025Reading the note…
5.1.0
31 Mar 2025Reading the note…
5.0.1
8 Oct 2024Reading the note…
5.0.0
10 Sep 2024Reading the note…
- 4.x
4.22.3
14 Sep 20264.22.2
11 May 2026Reading the note…
4.22.1
1 Dec 2025Reading the note…
4.22.0
1 Dec 2025Reading the note…
4.21.2
5 Dec 2024Reading the note…
4.21.1
8 Oct 2024Reading the note…
4.21.0
11 Sep 2024Reading the note…
4.20.0
10 Sep 2024Reading the note…
4.19.2
25 Mar 2024Reading the note…
4.19.1
20 Mar 2024Reading the note…
4.19.0
20 Mar 2024Reading the note…
4.18.3
29 Feb 2024Reading the note…
4.18.2
8 Oct 2022Reading the note…
4.18.1
29 Apr 2022Reading the note…
4.18.0
25 Apr 2022Reading the note…
4.17.3
17 Feb 2022Reading the note…
4.17.2
17 Dec 2021Reading the note…
4.17.1
26 May 2019Reading the note…
4.17.0
17 May 2019Reading the note…
4.16.4
11 Oct 2018Reading the note…
4.16.3
12 Mar 2018Reading the note…
4.16.2
10 Oct 2017Reading the note…
4.16.1
29 Sep 2017Reading the note…
4.16.0
28 Sep 2017Reading the note…
4.15.5
25 Sep 2017Reading the note…
4.15.4
7 Aug 2017Reading the note…
4.15.3
17 May 2017Reading the note…
4.15.2
6 Mar 2017Reading the note…
4.15.1
6 Mar 2017Reading the note…
4.15.0
1 Mar 2017Reading the note…
4.14.1
28 Jan 2017Reading the note…
4.14.0
16 Jun 2016Reading the note…
4.13.4
22 Jan 2016Reading the note…
4.13.3
3 Aug 2015Reading the note…
4.13.2
31 Jul 2015Reading the note…
4.13.1
6 Jul 2015Reading the note…
4.13.0
21 Jun 2015Reading the note…
4.12.4
18 May 2015Reading the note…
4.12.3
17 Mar 2015Reading the note…
4.12.2
3 Mar 2015Reading the note…
4.12.1
2 Mar 2015Reading the note…
4.12.0
23 Feb 2015Reading the note…
4.11.2
1 Feb 2015Reading the note…
4.11.1
21 Jan 2015Reading the note…