开工福利|免费学 2200+ 精品线上课,企业成员人人可得! 了解详情
写点什么

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:008203

评论

发布
暂无评论

【Servlet】这一文详细的讲述了Servlet的知识,呕心沥血,终于文成。

游坦之

javaWeb Servlet 11月月更

实验六 设计模式

游坦之

设计模式 11月月更

基于 Pipeline 实现完整的代码部署流水线

忙着长大#

模块六作业 - 拆分电商系统为微服务

小虎

架构训练营

【JavaWeb】过滤器和监听器,就这?

游坦之

javaWeb filter 11月月更

ELK 各组件功能及Elasticsearch 的节点角色类型介绍

忙着长大#

ELK

【设计模式】适配器模式:攻敌三分,自留七分,以超兽武装的例子来谈谈适配器模式

游坦之

软件工程 设计模式 11月月更

基于一段神奇的CSS渐变制作噪点效果

南城FE

CSS 前端 css特效 渐变

一文弄懂Vue与Servlet的交互:让你的大学课设变得容易起来

游坦之

Vue axios 11月月更

模块六-拆分电商系统为微服务

Geek_b35d92

微服务 拆分

软件设计与体系结构 实验二 经典软件体系结构风格(二)

游坦之

设计模式 11月月更

【SpringBoot】@Enable*注解和@Import

游坦之

spring-boot 11月月更

Vue复刻华为官网(三)

游坦之

Vue 11月月更

计算机网络(一):计算机网络概念、功能、组成

游坦之

计算机网络 11月月更

电商系统微服务拆分设计

π

架构师实战营

2022-11-27:超过经理收入的员工。编写一个SQL查询来查找收入比经理高的员工。以下数据的结果输出是Joe,因为Joe是唯一挣得比经理多的雇员。 DROP TABLE IF EXISTS `em

福大大架构师每日一题

MySQL 数据库 福大大

Baklib知识分享|知识管理中常用的5种工具

Baklib

Titus网关中的缓存一致性机制

俞凡

架构 netflix 大厂实践

软件设计体系 实验一 经典软件体系结构风格

游坦之

设计模式 11月月更

【JavaWeb】 Mybatis-01-Mybatis的简介:用对话的方式让你明白为什么要使用Mybatis

游坦之

mybatis javaWeb 11月月更

【JavaWeb】 Mybatis-03-Mybatis代理开发

游坦之

mybatis javaWeb 11月月更

【Tomcat】贰-Tomcat集成到Idea:解放双手,让Tomcat的操作没有那么难用

游坦之

tomcat javaWeb 11月月更

【JavaWeb】 Mybatis-02-Mybatis的快速入门

游坦之

mybatis javaWeb 11月月更

【JavaWeb】会话的学习笔记:Cookie和Session的知识点,这一次我总算学明白了

游坦之

javaWeb session 11月月更

【JavaWeb】一文搞懂Response

游坦之

javaWeb Response 11月月更

【JavaWeb】JSP学习笔记

游坦之

javaWeb jsp 11月月更

【JavaWeb】 一文搞懂Request

游坦之

javaWeb Request 11月月更

【SpringBoot】引入mybatis及连接Mysql数据库

游坦之

spring-boot 11月月更

极客时间运维进阶训练营第五周作业

忙着长大#

极客时间

【设计模式】装饰者模式:以造梦西游的例子讲解一下装饰者模式,这也是你的童年吗?

游坦之

软件工程 设计模式 11月月更

整合Mybatis、Servlet、Mysql、Axios、Filter、Session写一个入门级项目:非常适合初接触JavaWeb的小白白来进阶

游坦之

MySQL mybatis javaWeb Servlet 11月月更

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