91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Express框架中_router對象數據結構如何使用

發布時間:2023-03-25 11:50:36 來源:億速云 閱讀:155 作者:iii 欄目:開發技術

這篇文章主要介紹了Express框架中_router對象數據結構如何使用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Express框架中_router對象數據結構如何使用文章都會有所收獲,下面我們一起來看看吧。

_router 對象介紹

_router 對象是一個私有的屬性,但是它保存了重要的內容。其中就包括所有的合理的 Layer 對象以及其他的。它對我們分析 express 運行脈絡有很重要的作用。

使用調試直觀的獲取 _router 對象

要調試就需要準備以下的內容:

  • 一個簡單的能運行的 express demo。

  • 使用 vscode 編輯器進行調試。

  • 在合適的地方打上斷點并啟動帶有斷點的服務。

  • 觀察全部屬性并找到 _router 對象以及屬性。

  • 找出 stack.layer 的排列順序得出

  • 分析 _router 的嵌套對象

一個簡單的可以運行的 demo

  • index.js 是程序的入口文件:

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 方法添加了兩個路由:

  • /: 響應一個 json

  • /abc: 響應一個字符串

然后監聽在 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 是需要重點關注的

  • _router對象

Express框架中_router對象數據結構如何使用

_router 對象屬性比較簡單,其中需要關注的就是 stack 屬性,因為 stack 屬性后期會被遍歷取出 layer 來獲取 handle 執行函數。

找出 stack.layer 的排列順序

Express框架中_router對象數據結構如何使用

layer 的順序如下:

  • query: 內置 query 中間件產生

  • expressInit: 內置 exressInit 中間件產生

  • boundDispatch 1: get 路由 / 產生

  • boundDispatch 2: get 路由 /abc 產生

  • _router 的 stack 對象存儲的 Layer 實例,不是 route 對象的不添加 layer.route 為空:

Express框架中_router對象數據結構如何使用

以 query 內置中間件為例, route 是 undefined,表示不是路由,反之。

  • 手動添加的路由 router 對象,保存了自己的 route 信息

Express框架中_router對象數據結構如何使用

  • path

  • stack

  • methods

  • ...

Express框架中_router對象數據結構如何使用

route 中保存了自己的 stack 屬性,stack 保存屬于本路由的 layer, 暫且稱之為 routeLayer, routeLayer 實例中保持了 handle 方法,這個方法就是我們在 express 中寫的最多的路由處理函數。

Express框架中_router對象數據結構如何使用

分析 _router 的嵌套對象

_router 對象是 app 對象的屬性,是整個對象的路由屬性。

  • _router.stack 存儲了所有的 RouterLayer 對象,stack 中 RouterLayer 有自己的添加順序,內置 query/expressInit 中間件被首先添加,然后是手動添加的路由和中間件。

  • RouterLayer 中存在 route 屬性,純中間件 route 屬性為未定義,路由相關中間件 route 指向 Route 實例對象。app -> _router -> stack -> routerLayer[] -> routerLayer/routerLayer.route -> route.stack -> routeLayer[]/-> routeLayer/routeLayer.handle。

_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 不是頂層數據,app 才是。

  • _router 中保存了 router 相關的重要數據。stack 屬性中保存所有的 routerlayer 層級數據。

  • _router.stack 的每一個 layer 中 route 屬性一個有效路由數據。

  • route 中也保存了 stack route 層的 layer 數據。

  • route 層級的 layer 保存了 handle 和 handle 的參數

  • _router 數據結構中嵌套兩個棧一個是 router.stack 棧,一個是 route.stack 棧,保存自己層級的數據。

  • handle 作為底層路由的處理函數,被保存在 route.stack 的 layer 中

_router 中包含 router 和 route 層,每一層都自己的 stack, router 層與 route 層通過 stack 的 layer 中的 route 屬性鏈接,route 與 handle 函數鏈接通過 route 中 stack 儲存的 layer 的 handle 屬性鏈接,這就構成一個 _router 的數據結構:

Express框架中_router對象數據結構如何使用

關于“Express框架中_router對象數據結構如何使用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Express框架中_router對象數據結構如何使用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

师宗县| 兴仁县| 淳化县| 邢台县| 泽库县| 儋州市| 南漳县| 察哈| 彭水| 江华| 普兰店市| 融水| 嵊泗县| 河曲县| 江阴市| 漠河县| 锡林郭勒盟| 阳信县| 临沧市| 通道| 平湖市| 贵州省| 屯门区| 建昌县| 佛冈县| 乌苏市| 太谷县| 曲阜市| 政和县| 临颍县| 汾西县| 淳化县| 和静县| 克拉玛依市| 盘锦市| 房山区| 大丰市| 宜城市| 剑河县| 南康市| 六盘水市|