写点什么

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

评论

发布
暂无评论

美国站群服务器租用攻略:选择稳定高效的多站点管理服务

一只扑棱蛾子

站群服务器

活动预告 | 5月16日 Streaming Lakehouse Meetup · Online 与你相约!

Apache Flink

大数据 flink

IT外包能在企业上云时提供什么帮助?

Ogcloud

IT IT外包 IT外包公司 IT外包服务 IT外包服务商

SD-WAN实现全球应用加速

Ogcloud

SD-WAN 企业网络 SD-WAN组网 SD-WAN服务商 SDWAN

浅析MySQL代价模型:告别盲目使用EXPLAIN,提前预知索引优化策略

京东零售技术

后端 MySQL、

华为云开发者桌面全新发布CodeArts IDE for Python,极致优雅云原生开发体验

华为云PaaS服务小智

ide 软件开发 华为云

碳课堂|如何开展碳排放核算? ISO 14064-2 项目层次要点解读

AMT企源

双碳 碳管理 碳排放

【活动】5 月 18 日,@每一个对开源数字经济感兴趣的你!

Apache IoTDB

嘘!不可评价

充实的orzi

智能商品计划系统:引领未来零售业的革新之路

第七在线

大模型和传统ai的区别

悦数图数据库

【论文速读】|针对模糊驱动生成的提示性模糊测试

云起无垠

海外市场成 ISV 新掘金地?生成式 AI 如何加速业务创新实践?Zilliz 有话说

Zilliz

AWS 大模型 Zilliz LLM

万卡时代不打群架,中国智算正过三关

脑极体

算力

一键自动化博客发布工具,用过的人都说好(阿里云篇)

程序那些事

工具 程序那些事 自动发布

Kafka 业务日志采集最佳实践

观测云

kafka 日志分析

ETL工具中JSON格式的转换方式

RestCloud

json 数据处理 ETL

依赖Windows环境的CAD/CAE/CAM等软件如何在信创环境下过渡使用?

点量实时云渲染

信创 云桌面 云渲染 实时云渲染 国产信创

「活动预告」PolarDB走进青岛,邀请您一起畅游琴岛山海春韵,共话数据生态创新

阿里云数据库开源

数据库 阿里云 开源 Polar polarDB

大模型驱动的新一代 BI 平台,Sugar BI 开启智慧决策新模式

Baidu AICLOUD

大数据 BI

联发科发布天玑AI开发套件,为开发者提供“快、全、强、易”专业开发体验

科技范儿

京东按关键字搜索商品API(jd.item_search)返回值全面解析

技术冰糖葫芦

API 编排 API 文档 API 策略 pinduoduo API

@Async异步失效的9种场景

不在线第一只蜗牛

Java JVM 异步 开发语言

分布式数据库有哪几种

悦数图数据库

图数据库

低代码与云原生的技术解析:赋能企业数字化转型

不在线第一只蜗牛

云原生 低代码

OpenAPI 4 版本推出后会带来怎样的行业变革?

幂简集成

API OpenAPI

京东商品详情API接口:京东商品价格趋势分析,洞察消费者购买行为

tbapi

京东商品详情数据接口

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