# 迁移到 Express 5

# 概述

Express 5.0 仍处于 beta 发布阶段,但这里是发布中将要进行的更改以及如何将 Express 4 应用程序迁移到 Express 5 的预览。

要安装最新的测试版并预览 Express 5,请在应用程序根目录中输入以下命令:

$ npm install "express@>=5.0.0-beta.1" --save

然后,您可以运行自动化测试以查看失败的原因,并根据下面列出的更新修复问题。解决测试失败后,运行您的应用程序以查看发生了什么错误。您会立即发现应用程序是否使用了不受支持的任何方法或属性。

# Express 5 的变化

删除的方法和属性

  • app.del()
  • app.param(fn)
  • 复数方法名
  • app.param(name, fn) 的名称参数中的前导冒号
  • req.param(name)
  • res.json(obj, status)
  • res.jsonp(obj, status)
  • res.send(body, status)
  • res.send(status)
  • res.sendfile()

改变

  • 路径路由匹配语法

  • 从中间件和处理程序处理的拒绝 promise

  • app.router

  • req.host

  • req.query

改进

  • res.render()

# 删除的方法和属性

如果您在应用程序中使用这些方法或属性中的任何一个,它都会崩溃。因此,您需要在更新到版本 5 后更改您的应用程序。

# app.del()

Express 5 不再支持 app.del() 功能。如果您使用此函数,则会引发错误。要注册 HTTP DELETE 路由,请改用 app.delete() 函数。

最初使用 del 而不是 delete,因为 delete 是 JavaScript 中的保留关键字。但是,从 ECMAScript 6 开始,delete 和其他保留关键字可以合法地用作属性名称。

# app.param(fn)

app.param(fn) 签名用于修改 app.param(name, fn) 函数的行为。它自 v4.11.0 起已被弃用,Express 5 根本不再支持它。

# 复数方法名

以下方法名称已复数。在 Express 4 中,使用旧方法会导致弃用警告。Express 5 根本不再支持它们:

req.acceptsCharset()req.acceptsCharsets() 取代。

req.acceptsEncoding()req.acceptsEncodings() 取代。

req.acceptsLanguage()req.acceptsLanguages() 取代。

# app.param(name, fn) 名称中的前导冒号 (😃

app.param(name, fn) 函数名称中的前导冒号字符 (😃 是 Express 3 的残余,为了向后兼容,Express 4 通过弃用通知支持它。Express 5 将默默地忽略它并使用 name 参数而不用冒号作为前缀。

如果您遵循 app.param 的 Express 4 文档,这不会影响您的代码,因为它没有提及前导冒号。

# req.param(name)

这种检索表单数据的潜在混乱和危险方法已被删除。您现在需要专门在 req.paramsreq.bodyreq.query 对象中查找提交的参数名称。

# res.json(obj, status)

Express 5 不再支持签名 res.json(obj, status)。而是,设置状态,然后将其链接到 res.json() 方法,如下所示:res.status(status).json(obj)

# res.jsonp(obj, status)

Express 5 不再支持签名 res.jsonp(obj, status)。而是,设置状态,然后将其链接到 res.jsonp() 方法,如下所示:res.status(status).jsonp(obj)

# res.send(body, status)

Express 5 不再支持签名 res.send(obj, status)。而是,设置状态,然后将其链接到 res.send() 方法,如下所示:res.status(status).send(obj)

# res.send(status)

Express 5 不再支持签名 res.send(status),其中 status 是一个数字。而是使用 res.sendStatus(statusCode) 函数,该函数设置 HTTP 响应标头状态代码并发送代码的文本版本:"Not Found"、"Internal Server Error" 等。如果您需要使用 res.send() 函数发送数字,请引用该数字以将其转换为字符串,以便 Express 不会将其解释为尝试使用不受支持的旧签名。

# res.sendfile()

Express 5 中的 res.sendfile() 功能已被驼峰式版本 res.sendFile() 取代。

# 改变

# 路径路由匹配语法

路径路由匹配语法是指将字符串作为第一个参数提供给 app.all()app.use()app.METHOD()router.all()router.METHOD()router.use() API。对路径字符串与传入请求的匹配方式进行了以下更改:

  • 添加新的 ?*+ 参数修饰符。

  • 匹配组表达式只是 RegExp 语法。例如,(*) 不再有效,必须写为 (.*)。

  • req.params 中不再按位置提供命名匹配组。/:foo(.*) 仅作为 req.params.foo 捕获,不能作为 req.params[0] 使用。

  • 正则表达式只能在匹配组中使用。/\\d+ 不再有效,必须写成 /(\\d+)。

  • 删除了特殊的 * 路径段行为。/foo/*/bar 将匹配文字 * 作为中间段。

# 从中间件和处理程序处理的拒绝 promise

现在,通过将被拒绝的值作为 Error 转发给错误处理中间件来处理返回被拒绝 promise 的请求中间件和处理程序。这意味着使用 async 函数作为中间件和处理程序比以往任何时候都容易。当在 async 函数中抛出错误或在异步函数中 awaited 被拒绝的 Promise 时,这些错误将像调用 next(err) 一样传递给错误处理程序。

Express 如何处理错误的详细信息在 错误处理文档 中进行了介绍。

# app.router

在 Express 4 中删除的 app.router 对象在 Express 5 中卷土重来。在新版本中,此对象只是对基本 Express 路由的引用,这与 Express 3 中的应用程序必须显式加载它不同。

# req.host

在 Express 4 中,如果端口号存在,req.host 函数会错误地剥离端口号。在 Express 5 中,端口号保持不变。

# req.query

req.query 属性不再是可写属性,而是一个 getter。默认查询解析器已从 "extended" 更改为 "simple"。

# 改进

# res.render()

此方法现在对所有视图引擎强制执行异步行为,避免由具有同步实现且违反推荐接口的视图引擎引起的错误。

Last Updated: 6/17/2023, 6:57:19 PM