阿里云ODPS普惠算力再升级,Data+AI全产品降价低至59元! 了解详情
写点什么

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

评论

发布
暂无评论

CRMEB多商户后台前端代码打包并更新打包的代码到项目里面教程详解

CRMEB

框架中的自定义网关

Rubble

4月日更

软件设计模式:桥接模式

正向成长

设计模式 桥接模式

每位互联网人才都应该明白怎么通过XSS获取cookie

喀拉峻

网络安全 安全 信息安全

LotusDB 设计与实现—1 基本概念

roseduan

Go 数据库 存储

在终端中使用 GitHub Personal Access Token 访问仓库

信号量

茴字有四种写法,HTAP呢?

MatrixOrigin

数据库 MatrixOrigin MatrixOne 矩阵起源 超融合数据库

MongoDB的原理、基本使用、集群和分片集群

神农写代码

Go 实现 WebSockets:2. 如何在 Go 中创建 WebSockets 应用程序

宇宙之一粟

Go 语言 web socket 4月月更

深度学习实战:基于卷积神经网络的猫狗识别

Peter

人工智能 机器学习 深度学习

从单机定时到多层分发

程序员小航

Java 定时任务 XXL-JOB

编程新手如何提高编程能力?

Jackpop

在线时间戳计算时间差

入门小站

工具

一文简述:云原生应用十二要素

穿过生命散发芬芳

4月月更

网络安全之红蓝对抗实战

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 漏洞挖掘

微服务分布式事务处理

俞凡

架构 微服务

模块2作业

KennyQ

架构实战营 第 6 期 模块二课后作业

火钳刘明

#架构实战营 「架构实战营」

微信朋友圈的高性能复杂度

锎心😌😌😌

Python 中有什么不容易让人察觉的有趣的事实?

Jackpop

linux之tree命令

入门小站

[Day10]-[动态规划]最长回文子序列

方勇(gopher)

LeetCode 动态规划 数据结构算法

手写实现分布式锁

Linux服务器开发

分布式锁 协程 定时器 后端开发 Linux服务器开发

C/C++程序员黄金方向-音视频基础知识和ffmpeg编译

玩转音视频技术

HLS SRS 音视频开发 流媒体开发 C/C++程序员

全链路压测(九):容量评估和容量规划

老张

性能测试 全链路压测 稳定性保障

python中self与__init__怎么解释能让小白弄懂?

Jackpop

在线SQL美化格式化工具

入门小站

工具

mass哈希娱乐游戏Dapp开发搭建

薇電13242772558

区块链

2022第13周-技术分享记事

李印

随笔 工作经验

DIKW金字塔,AI爬到第几层了?

脑极体

8000字长文图解String,这次彻底搞懂了

Jackpop

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