Express.js 时隔十年发布 5.0.0 版本,聚焦稳定性与安全性

Express.js 时隔十年发布 5.0.0 版本,聚焦稳定性与安全性
2025年01月23日 13:30 InfoQ

作者 | Bruno Couriol

译者 | 张卫滨

策划 | Tina

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/)

声明:本文为 InfoQ 翻译整理,未经许可禁止转载。

财经自媒体联盟更多自媒体作者

新浪首页 语音播报 相关新闻 返回顶部