What are the major breaking changes and improvements in Express 5.0?
❓ Interview Prompt: Explain Express 5 automatic Promise rejection catching in async route handlers, path-to-regexp v8 routing syntax changes, and removed deprecated APIs.
After years in beta, Express 5.0 released with critical modernization improvements and breaking changes:
1. Automatic Async Error Handling (The Biggest Feature!):
In Express 4, if an 'async' route handler threw an exception or a Promise rejected, the Node.js process crashed unless you manually wrapped every handler in 'try/catch(err => next(err))'.
In Express 5, rejected Promises in async handlers and middleware are caught automatically and forwarded directly to your 4-argument error handling middleware!
2. Upgraded Routing Engine ('path-to-regexp' v8):
Wildcard routes have changed: legacy 'app.get("/users/")' is invalid in Express 5! You must use named parameters with custom regex: 'app.get("/users/splat")' or 'app.get("/users/:path(.*)")'.
3. Removed Deprecated Methods:
'res.send(status, body)', 'req.param(name)', and 'res.json(status, obj)' are completely removed.
Code Implementation Example
import express from 'express';
const app = express(); // Express 5.0+
// 1. Automatic Async Error Handling in Express 5! No try/catch needed!
app.get('/api/users/:id', async (req, res) => {
const user = await db.findUser(req.params.id);
if (!user) throw new Error('User not found'); // Caught automatically!
res.json(user);
});
// 2. Express 5 Routing Syntax for Wildcards
app.get('/files/*filePath', (req, res) => {
res.sendFile(`/srv/storage/${req.params.filePath}`);
});
app.use((err, req, res, next) => {
res.status(500).json({ error: err.message });
});Express 5 automatically catches rejected Promises in async route handlers and requires modern path-to-regexp v8 syntax for wildcard routes.