老手机翻新!Express. js v5.0中的新功能

原文:www.trevorlasn.com/blog/whats-...

原标题:What's New in Express.js v5.0

作者:Trevor I. Lasn
详细了解Express v5.0中的主要更改和改进以及如何迁移你的应用程序

Express. js终于在GitHub上发布了版本5.0。这是Express.js团队自2014年以来的第一个主要版本。

Express. js 5.0带来了一系列重要的更新、优化和删除。虽然它仍处于测试阶段,但此版本正在形成以提高性能并简化未来Node.js项目的开发。

Express. js 5.0需要Node.js 18或更高版本,因此任何仍在使用旧版本的人都需要升级。

安装Express. js 5.0

要试用Express. js 5.0,请运行:

npm 复制代码
npm install --save express@next

确保在NPM上检查最新版本的Express. js。现在,让我们探索新功能以及你需要进行哪些更新。

Express. js 5.0中的变化

在本节中,我将介绍Express. js 5.0中最重要的更改,并提供实用技巧来帮助你将现有应用顺利过渡到新版本。

删除的方法和属性

一些遗留方法已被删除,如果你使用以下任何一种方法,你将需要重构代码:

  1. app.del()-现在替换为app.delete()以符合现代JavaScript标准。是时候更新使用app.del()的所有实例了。
  2. app.param(fn)-这个用于修改app.param(name, fn)的助手完全消失了。它已经被弃用了一段时间,现在是时候永远删除它了。
  3. 复数方法-像req.acceptsCharset()这样的函数现在是复数的,例如,req.acceptsCharsets()。这是一个小变化,但对于保持代码兼容至关重要。
  4. req.param(name)-此方法已被删除。相反,你现在需要显式使用req.paramsreq.bodyreq.query来检索参数。
路径路由匹配更新

Express 5引入了路径路由匹配工作方式的变化。如果你的应用依赖于复杂的路由模式,你需要注意这些变化:

  • 你现在可以使用?*+参数修饰符。
  • RegExp语法更严格,因此必须将/foo*等路径更新为/foo(.*)

例如,如果你的代码之前匹配的路由如下:

js 复制代码
app.get('/user*', (req, res) => res.send('User'));

你需要将其更新为:

js 复制代码
app.get('/user(.*)', (req, res) => res.send('User'));
拒绝Promise处理

Express. js 5使异步中间件和路由中的错误处理变得更加容易。被拒绝的Promise会自动传递给错误处理中间件。这简化了使用async函数时的错误管理。

例如:

js 复制代码
app.get('/route', async (req, res, next) => {
  const result = await someAsyncFunction();
  res.send(result);
});

如果someAsyncFunction()抛出错误,它会自动被错误处理程序捕获,你不再需要手动调用next(err)

在Express. js 4中,如果你使用async/await并且Promise被拒绝(或抛出错误),你必须使用next(err)手动将错误传递给下一个中间件

js 复制代码
// Express 4
app.get('/route', async (req, res, next) => {
  try {
    const result = await someAsyncFunction();
    res.send(result);
  } catch (err) {
    next(err); // Manually pass the error to the error-handling middleware
  }
});

此设置需要try/catch块在每个使用async/await的路由或中间件中,以确保正确捕获错误并将其传递给Express. js的错误处理程序。

放弃对旧Node. js版本的支持

Express. js 5正式采用Node.js 18作为支持的最低版本。这意味着如果你运行的是Node.js 14等旧版本,是时候升级你的Node.js环境了。

重新引入app.router

在Express. js 4中删除的app.router对象已在Express.js 5中返回。然而,它现在只是对基本Express路由器的引用。你不再需要像在Express 3中那样显式加载它------当你开始使用路由时,它会自动可用。与Express 3等早期版本相比,这简化了事情。

js 复制代码
const express = require('express')
const app = express()

// Create a new router instance
const router = express.Router()

// Middleware that runs for any requests handled by this router
router.use((req, res, next) => {
  console.log('Router middleware triggered')
  next()
})

// Define a route that will handle requests to /events
router.get('/events', (req, res) => {
  res.send('Event list')
})

// Use the router for requests to /calendar
app.use('/calendar', router)

app.listen(3000, () => {
  console.log('Server is running on port 3000')
})
  • router对象处理所有以/calendar开头的请求
  • 如果请求来到/calendar/events,路由器中间件运行,然后路由处理程序以"事件列表"响应。
  • 路由器还可以处理多条路径,帮助你在应用程序的不同部分分离关注点。
对无效状态码进行更严格的错误处理

如果你尝试在响应中使用无效的状态代码,Express. js 5现在将抛出错误。例如:

js 复制代码
// This will throw an error in Express.js 5
res.status(999).send('Invalid status');

在Express. js 4中,这将静默失败,Express 5强制正确使用有效的HTTP状态代码。

res.render()的改进

res.render()方法现在在所有视图引擎之间强制执行异步行为。这可以防止由使用同步渲染的旧视图引擎引起的错误。

Express. js生态系统的显着增强

除了Express. js中的核心更改外,该项目还在相关包中看到了一些改进:

  • 依赖项重构:Express. js 5现在使用Array.flat()等原生Node.js方法,而不是依赖array-flatten等包。此外,该项目删除了path-is-absolute等依赖项,更喜欢内置的path.isAbsolute()方法。
  • 安全改进: 已添加威胁模型以提高项目内的安全意识和措施。CodeQL(静态应用程序安全测试)也已集成以捕获代码库中的漏洞。
  • CI改进: 持续集成(CI)管道已进行优化,以减少重复运行并提高效率。Node. js 22支持已添加到CI测试矩阵中,使Express.js与最新的Node.js版本兼容。
  • OSSF记分卡: Express. js 5现在包含一个OSSF记分卡徽章,它提供了对项目安全运行状况和开源最佳实践的可见性。
  • 更新的依赖项: 核心依赖项,如encodeurlsendcookie-parserqs都已更新到最新版本,以提高安全性、性能和与现代Node. js的兼容性。

参考文献
  1. expressjs.com/en/5x/api.h...
  2. expressjs.com/en/guide/mi...
  3. github.com/expressjs/e...
相关推荐
我只会写Bug啊15 小时前
Vue文件预览终极方案:PNG/EXCEL/PDF/DOCX/OFD等10+格式一键渲染,开源即用!
前端·vue.js·pdf·excel·预览
橙子家16 小时前
Serilog 日志库简单实践(二):控制台与调试 Sinks(.net8)
后端
扯蛋43816 小时前
LangChain的学习之路( 一 )
前端·langchain·mcp
Mr.Jessy16 小时前
Web APIs学习第一天:获取 DOM 对象
开发语言·前端·javascript·学习·html
想不明白的过度思考者16 小时前
Rust——异步递归深度指南:从问题到解决方案
开发语言·后端·rust
ConardLi17 小时前
Easy Dataset 已经突破 11.5K Star,这次又带来多项功能更新!
前端·javascript·后端
芒克芒克18 小时前
ssm框架之Spring(上)
java·后端·spring
冴羽18 小时前
10 个被严重低估的 JS 特性,直接少写 500 行代码
前端·javascript·性能优化
rising start18 小时前
四、CSS选择器(续)和三大特性
前端·css
冒泡的肥皂18 小时前
MVCC初学demo(二
数据库·后端·mysql