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 这类补丁都可以移除——这也是清理技术债的好机会。


参考文档

本文依据公开文档整理,示例需按项目依赖版本验证;不将文档中的性能描述视为本项目实测结果。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台