报名参加CloudWeGo黑客松,奖金直推双丰收! 了解详情
写点什么

Express.js 时隔十年发布 5.0.0 版本,聚焦稳定性与安全性

作者:Bruno Couriol

  • 2025-02-06
    北京
  • 本文字数:1372 字

    阅读完需:约 5 分钟

Express.js 时隔十年发布 5.0.0 版本,聚焦稳定性与安全性

Express.js 团队发布了 5.0.0 版本,这距离该团队 2014 年发布第一个主版本已经过去了 10 年的时间。这个版本主要关注稳定性和安全性,其目标是帮助开发人员编写更健壮的 Node.js 应用程序。


Express 5 放弃了对旧版本 Node.js 的支持。发布说明这样写到:


该版本不再支持 v18 版本以前的 Node.js。这是一个重要的变化,因为对旧版本 Node.js 的支持阻碍了性能和可维护性方面的很多重要变更。这一变化还使持续集成(CI)更加稳定且可维护性更高,也易于采用新语言和新运行时的特性并放弃不再需要的依赖关系。


在进行安全审计后,团队决定对路径路由匹配的运行方式进行修改。为了避免 正则表达式拒绝服务(regular expression Denial of Service,ReDoS)攻击,Express 5 不再支持正则表达式中的子表达式,例如/:foo(\\d+)


// Express 4 的样例app.get('/:id(\\d+)', (req, res) => res.send(`ID: ${req.params.id}`));
复制代码


Express.JS 技术委员会的成员 Blake Embrey 提供了一个正则表达式的样例(例如,/^\/flights\/([^\/]+?)-([^\/]+?)\/?$/i),当与’/flights/’ + ‘-’.repeat(16_000) + '/x’匹配时,可能需要 300 毫秒,而不是低于 1 毫秒。Express 团队建议使用强大的输入校验库。


Express 5 还要求正则表达式中的通配符必须明确命名或用 (.*)** 替换,以提高清晰度和可预测性。因此,像 /foo


这样的路径必须更新为 /foo(.*)。


路由中可选参数的语法也发生了变化。Express 4 中的:name? 变成了{/:name}:


// Express 4 的样例app.get('/user/:id?', (req, res) => res.send(req.params.id || 'No ID'));

// Express 5 的样例app.get('/user{/:id}', (req, res) => res.send(req.params.id || 'No ID'));
复制代码


正则捕获组中的未命名参数不再允许通过索引进行访问。现在的参数必须命名:


// Express 4 的样例app.get('/user(s?)', (req, res) => res.send(req.params[0])); // 's'

// Express 5 的样例app.get('/user:plural?', (req, res) => res.send(req.params.plural));
复制代码


Express 5 还强制执行 HTTP 状态码的有效性检查,作为防止静默失败的防御措施,也避免艰难的调试过程。


// Express 4 的样例res.status(978).send('Invalid status');  // Silently fails

// Express 5 的样例res.status(978).send('Invalid status'); // Throws an error
复制代码


Express.js 5 让异步中间件和路由中的错误处理变得更加简单。Express 5 改进了异步中间件和路由中的错误处理,它自动将拒绝的 promise 传递给错误处理中间件,无需再使用 try/catch 块。


// Express 4 的样例app.get('/data', async (req, res, next) => {  try {    const result = await fetchData();    res.send(result);  } catch (err) {    next(err);  }});

// Express 5 的样例app.get('/data', async (req, res) => { const result = await fetchData(); res.send(result);});
复制代码


虽然 Express 团队努力将破坏性改动保持在最低水平,但希望将 Express 代码升级到新版本的开发人员还是要小心留意。开发人员可查看在线的迁移指南。


Express.js 是 OpenJS 基金会(At-Large 类别)的一个项目。开发人员可以阅读完整的发布说明,了解更多技术细节和样例。


原文链接:


Express 5.0 Released, Focuses on Stability and Security(https://www.infoq.com/news/2025/01/express-5-released/)

2025-02-06 11:009588

评论

发布
暂无评论

盘点|2021最受开发者欢迎和最具行业影响力的文章

阿里巴巴云原生

阿里云 开发者 云原生 年终盘点

云原生实战派:2021 让改变发生,2022 让创新升级

阿里巴巴云原生

阿里云 云原生 年度盘点

Java Jackson 中如何 Pending JSON 对象到数组中

HoneyMoose

一个cpp协程库的前世今生(十二)自旋锁

SkyFire

c++ cocpp

Tableau Day3:智能分析

贾献华

Tableau 1月月更

博睿APM获《金融电子化》2021年金融业新技术应用创新突出贡献奖

博睿数据

AWS S3 最小目录权限(qbit)

qbit

对象存储 AWS S3 权限

揭秘阿里云神龙团队拿下TPCx-BB排名第一的背后技术

阿里云弹性计算

大数据 阿里云 神龙

没想到,学棋五年的我竟然输给了昇腾CANN!

华为云开发者联盟

机器人 强化学习 CANN 昇腾 机械臂

做数据分析已经会Excel了,还要学Python吗?

博文视点Broadview

LabVIEW目标测量方法(基础篇—12)

不脱发的程序猿

机器视觉 图像处理 LabVIEW 目标测量方法 目标尺寸测量

阿里云 MSE 云原生网关助力斯凯奇轻松应对双 11 大促

阿里巴巴云原生

阿里云 云原生 MSE 斯凯奇

2021年12月云主机性能评测报告

博睿数据

第五周作业

lv

设计模式【9】-- 外观模式?没那么高大上

秦怀杂货店

Java 设计模式 外观模式

【盘点 2021】义无反顾,投身福报,我的2021年度总结

Zhendong

阿里巴巴 年终总结

Python原生数据结构增强模块collections

Java全栈架构师

Python 数据库 程序员 数据结构 面试

如何在零停机的情况下迁移 Kubernetes 集群

阿里巴巴云原生

阿里云 Kubernetes 容器 云原生 数据迁移

以一致的体验交付和管理云原生多集群应用

阿里巴巴云原生

阿里云 云原生 KubeVela OCM 交付

基于机器学习和深度学习,华为大佬手写AIoT系统学习小册

Java全栈架构师

Python 数据库 程序员 AI 面试

架构训练营 week4 课程总结

红莲疾风

「架构实战营」

深度剖析:Kafka 请求是如何处理的? 看完这篇文章彻底懂了

Kafka中文社区

从本科退学,到再拿本科,2021我的5年技术“弯路”回轨了|1.2w字

杨成功

程序员 前端 盘点2021

【LeetCode】括号的最大嵌套深度Java题解

Albert

算法 LeetCode 1月月更

熬夜整理56个JavaScript高级的手写知识点!!专业扫盲!

Sunshine_Lin

JavaScript 面试 进阶 ES6 手写

Vue3的8种组件通信方式

编程江湖

Vue 3

央视频“数字雪花”互动项目上线,为全民打造冰雪体育盛宴

郝俸🦁好棒

聚焦高质量发展,AI创业企业如何释放数智新潜力?

脑极体

当云服务变成云云云云服务,谁能带领企业穿越云层?

白洞计划

06 Prometheus之exporter及查询持久性

穿过生命散发芬芳

Prometheus 1月月更

ReactNative进阶(七):导航组件 react-navigation

No Silver Bullet

React Native 导航 1月月更

Express.js 时隔十年发布 5.0.0 版本,聚焦稳定性与安全性_编程语言_InfoQ精选文章