将6.x迁移到7.x迁移

介绍

restify 7.x 具有全新的路由器和中间件逻辑,可为您的应用带来显着的性能提升。从 v7.0.0 开始,restify 使用基于 find-my-way 包的 Radix Tree 作为路由器后端。

突破性改变

服务器返回 RequestCloseError 代替 RequestAbortedError

在由于某种原因客户端终止请求的情况下,服务器返回 RequestCloseError 而不是 RequestAbortedError

新版本的 restify 永远不会返回 RequestAbortedError

非严格的路由消失了

选项 strictRouting 被删除 createServer({ strictRouting: false })。严格路由是新的默认路由。

最后路径的尾部斜线

/path/path/ 在 restify v7.x 中是不一相同的。 如果您不想区分它们,请使用 ignoreTrailingSlash: true 服务器选项。

路径必须以 / 开头

在 restify 7.x 中路径必须以 / 开头。 例如 server.get('foo') 无效,请将其改为 server.get('/foo')

如果您使用 enroute ,请确保您已将其更新至最新版本。

路由器路径和通配符中不同的 RegExp 用法

restify 的新路由器后端 find-my-way 支持有限的 RegExp。

定义路径的指南

要注册参数路径,请在参数名称之前使用冒号通配符使用星号请记住,静态路由始终位于参数和通配符之前。

  1. // 参数
  2. server.get('GET', '/example/:userId', (req, res, next) => {}))
  3. server.get('GET', '/example/:userId/:secretToken', (req, res, next) => {}))
  4. // 通配符
  5. server.get('GET', '/example/*', (req, res, next) => {}))

正则表达式路由也受支持,但请注意,RegExp 非常耗性能!

  1. // 带 RegExp 的参数
  2. server.get('GET', '/example/:file(^\\d+).png', () => {}))

RegExp 路径块需要在括号之间。

可以在同一对斜线(”/“)内定义多个参数。如:

  1. server.get('/example/near/:lat-:lng/radius/:r', (req, res, next) => {}))

记住在这种情况下使用破折号(”-“)作为参数分隔符。

最后,RegExp 可能有多个参数。

  1. server.get('/example/at/:hour(^\\d{2})h:minute(^\\d{2})m', (req, res, next) => {
  2. // req.params => { hour: 12, minute: 15 }
  3. }))

在这种情况下,作为参数分隔符,它可以使用任何与正则表达式不匹配的字符。

有多个参数的路由可能会对性能产生负面影响,所以尽可能地使用单一参数的方式,特别是在应用程序的热门路径上的路由。

更多信息请参阅:https://github.com/delvedor/find-my-way

删除已弃用的 next.ifError

next.ifError(err) 不再可用。

默认情况下禁用 DTrace 探测

DTrace 探针会造成一些性能影响。虽然它有着良好的可观察性,但您可能根本用不到它。

可以调用 next 多次

之前的 restify 会自动阻止超过一次的 next() 调用。 在新版本中,默认情况下此行为处于禁用状态,但您可以使用 onceNext 属性来激活它。

strictNext 选项的行为不变。 这意味着 strictNext 会强制执行 onceNext 选项。

  1. var server = restify.createServer({ onceNext: true })
  2. server.use(function (req, req, next) {
  3. next();
  4. next();
  5. });
  6. // -> 可用
  7. var server = restify.createServer({ strictNext: true })
  8. server.use(function (req, req, next) {
  9. next();
  10. next();
  11. });
  12. // -> 抛出错误

路由器版本和内容类型

accept-versionaccept 基于条件的路由移动到了 conditionalHandler 插件中,请查阅文档或示例:

  1. var server = restify.createServer()
  2. server.use(restify.plugins.conditionalHandler({
  3. contentType: 'application/json',
  4. version: '1.0.0'
  5. handler: function (req, res, next) {
  6. next();
  7. })
  8. });
  9. server.get('/hello/:name', restify.plugins.conditionalHandler([
  10. {
  11. version: '1.0.0',
  12. handler: function(req, res, next) { res.send('1.x') }
  13. },
  14. {
  15. version: ['1.5.0', '2.0.0'],
  16. handler: function(req, res, next) { res.send('1.5.x, 2.x') }
  17. },
  18. {
  19. version: '3.0.0',
  20. contentType: ['text/html', 'text/html']
  21. handler: function(req, res, next) { res.send('3.x, text') }
  22. },
  23. {
  24. version: '3.0.0',
  25. contentType: 'application/json'
  26. handler: function(req, res, next) { res.send('3.x, json') }
  27. }
  28. ]);
  29. // 'accept-version': '^1.1.0' => 1.5.x, 2.x'
  30. // 'accept-version': '3.x', 接受:'application/json' => '3.x, json'

当请求被刷新并完成最后的处理程序时触发 After 事件

在 7.x 中,当请求被刷新并完成最后的处理程序时触发 after 事件。

指标插件的延迟

在 7.x 中,指标插件的 latency 是在请求完全刷新时计算的。之前它是在最后一个处理程序完成时计算的。

为了兼容之前的使用案例,新时间被添加到指标插件中: To address the previous use-cases, new timings were added to the metrics plugin:

  • metrics.totalLatency 请求被刷新并完成了所有的处理程序
  • metrics.preLatency pre 处理程序延迟
  • metrics.useLatency use 处理程序延迟
  • metrics.routeLatency route 处理程序延迟