写点什么

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

评论

发布
暂无评论

新必应(New Bing)申请出错终极方案

kcodez

微软 ChatGPT New Bing

堪称神级!GitHub上标星157K的Java教程,全程干货,只讲重点

Java

2022 IoTDB Summit:IoTDB PMC 曹高飞《Apache IoTDB 秒级扩容能力与存算分离实践》

Apache IoTDB

数据库 IoTDB

JDK 环境配置

流火

Java centos jdk window

SpringBoot+ThreadPoolTaskExecutor 批量插入百万级数据实测

Java Spring Boot 多线程 ThreadPoolTaskExecutor

2.基于Label studio的训练数据标注指南:(智能文档)文档抽取任务、PDF、表格、图片抽取标注等

汀丶人工智能

自然语言处理 数据标注

开源如何推动云计算的发展与创新 | 雨林开源行

开源雨林

开源 kubenetes OpenStack

架构实战营模块1第3课 - 什么是面向复杂度架构设计

净意

Portraiture4中文免费ps滤镜磨皮插件

茶色酒

Portraiture3

从理论到实践:MySQL性能优化和高可用架构,一次讲清

Java MySQL 数据库 面试 性能优化

手把手教你使用 Python 调用 ChatGPT-3.5-API

老表

Python GPT-3 ChatGPT

在深圳龙岗,看见空间智能化的潮水涌动

脑极体

全屋智能

得物供应链复杂业务实时数仓建设之路

小小怪下士

Java 程序员 后端

字字珠玑!GitHub爆赞的网络协议手册,被华为大佬指定内部必学?

Java 计算机网络 网络协议

一文彻底弄清楚分布式锁

Java 分布式锁

【我在京东做研发】揭秘支撑京东万人规模技术人员协作的行云DevOps平台

京东科技开发者

零基础如何学习Web 安全,如何让普通人快速入门网络安全?

网络安全学海

黑客 网络安全 信息安全 渗透测试 WEB安全

ChatGPT Turbo API 18元/100万个单词

kcodez

openai ChatGPT

FL Studio2023免费中文版数字音频工作站软件

茶色酒

FL Studio2023

图像的滤波与图像增强的Matlab实现

timerring

数字图像处理

爱不释手!阿里十几位大牛联玦整理—23年最全面试八股文合集

Java java面试 Java八股文 Java面试题 Java面试八股文

赞不绝口!仅靠阿里P9分享的 Redis 工作手册,拿到60W年薪Offer

Java 数据库 redis 缓存 面试

2022 IoTDB Summit:Apache IoTDB PMC 张金瑞《为物联网场景优化的时序数据库共识协议》

Apache IoTDB

大数据 IoTDB

ClickHouse 与 Amazon S3 结合?一起来探索其中奥秘

亚马逊云科技 (Amazon Web Services)

在文心一言出生地,百度悄悄燃烧AI小宇宙

白洞计划

百度 文心一言

人工智能+低代码,打通AI落地的最后“一公里”

明道云

MongoDB写入数据策略

NineData

nosql mongodb Journaling 写入策略 读策略

会声会影2023中文最新版消息

茶色酒

会声会影2023

再有人问你什么是分库分表,直接把这篇文章发给他

Java 分库分表

Spring Boot 整合流程引擎 Flowable,so easy

Java Spring Boot 流程引擎 flowable

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