写点什么

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

评论

发布
暂无评论

如何高效部署YashanDB数据库以提升数据安全

数据库砖家

如何高效迁移到YashanDB:步骤与注意事项

数据库砖家

如何构建基于YashanDB数据库的高效数据模型

数据库砖家

PopClip for Mac(增强型复制粘贴工具)v2025

春天的风暖暖的

企业应用中YashanDB的负载测试流程详述

数据库砖家

趋势型分析:YashanDB如何引领数据库技术创新

数据库砖家

全面指南:部署YashanDB数据库的10个步骤详解

数据库砖家

如何高效部署YashanDB数据库实现企业级数据管理

数据库砖家

如何构建基于YashanDB数据库的实时分析平台

数据库砖家

构建一个高效的 YashanDB 环境

数据库砖家

Acorn for Mac(mac图像处理软件)

春天的风暖暖的

搭建基于 YashanDB 的企业级数据架构

数据库砖家

如何构建基于YashanDB数据库的数据仓库

数据库砖家

简单攻击瘫痪警用机器人:低级软件缺陷让高价硬件形同虚设

qife122

网络安全 机器人安全

如何高效部署YashanDB数据库实现业务优化

数据库砖家

高效实施 YashanDB 的数据准备与清洗流程

数据库砖家

Smooze Pro for Mac(专业的鼠标增强工具)

春天的风暖暖的

如何从用户角度改善YashanDB功能体验

数据库砖家

如何高效部署YashanDB数据库实现企业数字化转型

数据库砖家

Photos Exif Editor for Mac(摄影必备照片EXIF编辑器)

春天的风暖暖的

融合AI技术的YashanDB未来数据库发展方向

数据库砖家

融合边缘计算的YashanDB数据库应用创新及发展趋势

数据库砖家

如何打造安全可靠的YashanDB数据库访问控制体系

数据库砖家

基于YashanDB数据库构建智能客服系统的技术指南

数据库砖家

如何高效利用YashanDB数据库提升企业数据管理能力

数据库砖家

如何处理YashanDB数据库中的大规模数据

数据库砖家

高通的AI新程,下一个激荡三十年

脑极体

AI

企业选择YashanDB数据库的五大核心理由

数据库砖家

如何高效部署YashanDB数据库实现企业数据管理升级

数据库砖家

构建基于 YashanDB 数据库的弹性数据服务架构

数据库砖家

如何管理YashanDB中的数据访问权限

数据库砖家

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