Express 迁移到 5.x 版本
尽管 Express 5.0 仍处于测试阶段 (Beta),这里先介绍该预览版本中的更改以及如何将你的 Express 4 应用程序迁移到 Express 5。
安装最新测试版并预览 Express 5:
在你的应用程序根目录中输入以下命令:
$ npm install "express@>=5.0.0-beta.1" --save
迁移步骤:
- 运行自动化测试: 查看哪些测试用例失败,并根据下面列出的更新内容修复问题。
- 运行应用程序: 检查是否出现错误。
移除的方法和属性:
- app.del()
- app.param(fn)
- Pluralized method names
- Leading colon in name argument to app.param(name, fn)
- req.param(name)
- res.json(obj, status)
- res.jsonp(obj, status)
- res.send(body, status)
- res.send(status)
- res.sendfile()
变更:
- Path route matching syntax
- Rejected promises handled from middleware and handlers
- app.router
- req.host
- req.query
改进:
移除的方法和属性
如果你的应用程序中使用了以下任一方法或属性,应用程序将会崩溃。因此,在更新至版本5后,你需要对应用程序进行更改。
app.del()
Express 5 不再支持 app.del()
函数。如果你使用了这个函数,将会抛出错误。要注册 HTTP DELETE 路由,请改用 app.delete()
函数。
最初,由于 delete
是 JavaScript 中的保留关键字,所以使用了 del
替代。然而,自 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 将默默忽略它,并使用不带前缀冒号的名称参数。
如果你遵循 Express 4 的 app.param
文档,这应该不会影响你的代码,因为文档中没有提到前导冒号。
req.param(name)
检索表单数据的这一潜在混淆且危险的方法已被移除。现在,你需要在 req.params
、req.body
或 req.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()res.sendfile()
函数在 Express 5 中已被驼峰命名的 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 拒绝处理
返回被拒绝 Promise 的请求中间件和处理器现在通过将拒绝的值作为 Error 转发到错误处理中间件来处理。这意味着使用异步函数作为中间件和处理器变得前所未有地容易。当异步函数中抛出错误或等待中的 Promise 被拒绝时,这些错误将作为调用 next(err) 的错误传递给错误处理器。
Express 如何处理错误的详细信息包含在错误处理文档中。
app.router
在 Express 4 中被移除的 app.router
对象在 Express 5 中重出江湖。在新版本中,这个对象仅仅是对基础 Express 路由器的引用,与 Express 3 不同,后者的应用程序需要显式加载它。
req.host
在 Express 4 中,req.host
函数如果存在端口号,则会错误地将其剥离。在 Express 5 中,端口号被保留。
req.queryreq.query
属性不再是可写属性,而是变成了一个 getter。默认的查询解析器已从“extended”更改为“simple”。
改进
res.render()
该方法现在对所有视图引擎强制执行异步行为,避免了那些具有同步实现并违反了推荐接口的视图引擎所引起的错误。