Express 5 新特性详解:十年等待带来了什么
Express 5 正式发布:Promise 错误自动捕获、路由匹配改进、状态码校验收紧、移除废弃 API。本文梳理全部变化点与升级迁移指南。
Express 5 最大的变化是异步路由的 Promise rejection 自动进入错误中间件**——十年顽疾就此终结。其余变化是清理性质的:path-to-regexp 升级带来路由语法收紧、废弃方法移除、Node 18+ 起步。升级成本远低于预期,新项目直接上 5。**
为什么这次升级"雷声大雨点小"
Express 5 开发了十年,但定位刻意保守:不推翻、不重构,只修稳定性和对齐现代 Node。对绝大多数应用,变化集中在少数几个点——这是好事:一个承载百万级应用的框架,无聊比惊喜更珍贵。
头号变化:Promise rejection 自动处理
Express 4 的异步路由抛异常不会进错误中间件(必须手动 next(err)),这是社区十年的痛:
// Express 4:必须 try/catch + next(err)
app.get('/user', async (req, res, next) => {
try {
res.json(await fetchUser());
} catch (e) { next(e); }
});
// Express 5:自动捕获,直接 throw
app.get('/user', async (req, res) => {
res.json(await fetchUser()); // 抛错自动进错误中间件
});
仅此一条就值回升级成本——满坑满谷的 asyncHandler 包装函数可以退役了。
路由匹配的收紧
path-to-regexp 升级带来的语法变化:
*通配符必须命名:/files/*→/files/*splat;- 可选段写法变化:
/:id?→/{:id}; - 正则表达式内联写法的部分语法收紧。
迁移时全局搜索路由字符串,重点检查 * 和 ? 用法。
其他行为变化
- 状态码校验:
res.status(999)等非法状态码现在抛错(此前静默通过); - 移除废弃 API:
app.del(用 app.delete)、res.json(obj, status)双参形式、res.sendfile等全部被移除——用了多年的废弃警告终于落地; - app.router 回归:Express 4 移除的路由器挂载点在 5 里回归,高级路由组合场景可用;
- body-parser 变化:内置 express.json() 等中间件更新到底层新版,编码处理更严格;
- Node 版本要求:Node 18 起步。
要不要升级
升。理由:异步错误处理是实打实的开发体验与安全提升(漏掉的 rejection 曾是静默事故源);Express 4 已进入纯维护模式,安全修复未来以 5 为主。路径:先跑 npx @expressjs/codemod 自动迁移工具,再全局检查路由通配符与废弃 API 使用,最后全量回归测试。
常见问题(FAQ)
Q:Express 5 生态的中间件兼容吗?
主流中间件(cors、morgan、helmet、express-rate-limit)均已适配。老中间件重点验证:依赖被移除 API 的、操作 res 内部属性的。先跑测试套,再逐个核对 package.json 里的 express 相关依赖版本。
Q:Express 5 和 Fastify/Hono 还有可比性吗?
Express 5 解决的是"历史包袱"而非"性能竞赛"——基准性能仍落后 Fastify/Hono。Express 的价值在生态惯性与团队熟悉度;新项目的性能敏感场景依然可以选 Fastify/Hono(见本系列对比篇)。
Q:升级后 asyncHandler 库还要吗?
不要了。Express 5 原生处理 Promise rejection,asyncHandler、express-async-errors 这类补丁都可以移除——这也是清理技术债的好机会。
参考文档
本文依据公开文档整理,示例需按项目依赖版本验证;不将文档中的性能描述视为本项目实测结果。