Express框架中_router对象数据结构如何使用

发布时间:2023-03-25 11:50:36 作者:iii
来源:亿速云 阅读:157

这篇文章主要介绍了Express框架中_router对象数据结构如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Express框架中_router对象数据结构如何使用文章都会有所收获,下面我们一起来看看吧。

_router 对象介绍

_router 对象是一个私有的属性,但是它保存了重要的内容。其中就包括所有的合理的 Layer 对象以及其他的。它对我们分析 express 运行脉络有很重要的作用。

使用调试直观的获取 _router 对象

要调试就需要准备以下的内容:

一个简单的可以运行的 demo

import express from 'express'
const app = express()
app.get('/', (_, res)=> {
  res.json({
    ab: 123,
  })
})
app.get('/abc', () => {
  res.send('x')
})
app.listen(3232, () => {
  console.log("Listen on port 3232")
})

app 上使用了 get 方法添加了两个路由:

然后监听在 3232 端口。

使用 vscode 初始化一个调试文件

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Launch Program",
      "skipFiles": [
        "<node_internals>/**"
      ],
      "program": "${workspaceFolder}/index.js"
    }
  ]
}

调试文件会以 ${workspaceFolder}/index.js 为入口启动 express 服务,在 vscode 侧边栏找到调试项目,开始调试。

在合适的地点打一个断点

哪里合适?

当然是在 listen 之前最为合适,此时 express 内部工作已经基本完成,只需要监听端口等待请求到来。

Express框架中_router对象数据结构如何使用

启动服务

Express框架中_router对象数据结构如何使用

使用 vscode 调试配置与调试工具启动服务

观察全部属性并找到 _router 对象以及属性

Express框架中_router对象数据结构如何使用

由于 express 创建 app, 混入了很多的属性和方法所以需要对其进行有基本的认识,其中被本文关注的 _router 是需要重点关注的

Express框架中_router对象数据结构如何使用

_router 对象属性比较简单,其中需要关注的就是 stack 属性,因为 stack 属性后期会被遍历取出 layer 来获取 handle 执行函数。

找出 stack.layer 的排列顺序

Express框架中_router对象数据结构如何使用

layer 的顺序如下:

Express框架中_router对象数据结构如何使用

以 query 内置中间件为例, route 是 undefined,表示不是路由,反之。

Express框架中_router对象数据结构如何使用

Express框架中_router对象数据结构如何使用

route 中保存了自己的 stack 属性,stack 保存属于本路由的 layer, 暂且称之为 routeLayer, routeLayer 实例中保持了 handle 方法,这个方法就是我们在 express 中写的最多的路由处理函数。

Express框架中_router对象数据结构如何使用

分析 _router 的嵌套对象

_router 对象是 app 对象的属性,是整个对象的路由属性。

_router 对象的相关源码

app.lazyrouter = function lazyrouter() {
  if (!this._router) {
    this._router = new Router({
      caseSensitive: this.enabled('case sensitive routing'),
      strict: this.enabled('strict routing')
    });
    this._router.use(query(this.get('query parser fn')));
    this._router.use(middleware.init(this));
  }
};

_router 函数在 lazyrouter 函数中被实现,并且是懒实现(有了就不在重新实现了),实现之后立即添加两个中间件。本质就是一个 Router 类的实例。

_router 的数据结构分析

_router 中包含 router 和 route 层,每一层都自己的 stack, router 层与 route 层通过 stack 的 layer 中的 route 属性链接,route 与 handle 函数链接通过 route 中 stack 储存的 layer 的 handle 属性链接,这就构成一个 _router 的数据结构:

Express框架中_router对象数据结构如何使用

关于“Express框架中_router对象数据结构如何使用”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Express框架中_router对象数据结构如何使用”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. 如何利用express异步函数对异常进行捕获
  2. vue-cli+express如何获取mongodb数据

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

express router

上一篇:Java异步编程之Callbacks与Futures模型怎么调用

下一篇:php如何删除字符串开头的指定字符

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》