漸進式Express原始碼學習5 全副武裝

2021-09-11 13:42:22 字數 1556 閱讀 3336

這是漸進式express原始碼學習 | 小白也能懂原始碼系列文章的第五篇。

請結合該節**閱讀lesson5-全副武裝

這篇文章我們在第四篇文章的基礎上,實現乙個稍微加強版的express,功能包括

這篇文章要實現的express的期望用法如下

const express = require('../index.js')

res.end(`welcome, the user.id = $ and the user.name is $`)

}) req.user =

next()

}) res.end(`welcome, the article's title is $`)

})複製**

核心實現:1. layer借助path-to-regexp提取params。 2.在router.handle裡面,process_params函式依次呼叫引數處理函式

這節課裡,和上一節課,主要的變化體現在2個方面,其他的檔案的變化很好理解,這裡不做解釋

lib/route/layer.js

在match函式裡面,獲取到req物件的params值

lib/route/index.js

增加process_params

增加param函式

handle

把layer的params複製req

呼叫process_params

首先我們看layer.match函式

還記得這個layer.match是在**呼叫的嗎?是在請求到來的時候,router.handle裡面呼叫的,也就是說我們這個時候有了req,也有了req的path。

看第52行的keys,還記得這個keys是什麼嗎?沒錯,就是儲存了引數物件的陣列這樣的。 52-61行做的事情,就是在path匹配的情況下,把path裡面的引數值提取出來,放到layer.params裡面

從圖中我們可以看到,他其實什麼也沒做,只是把fn儲存在了陣列裡 我們再看router.process_params函式

這個函式裡面,有兩層遞迴,分別是param()和paramcallback()。對這兩個函式,簡單的說,有幾個引數就會呼叫幾次param,計數器是keys.length(**86行),例如

// 這個只有乙個引數userid,param()只會被呼叫一次

// 這個有兩個引數,分別是type和state,param()會被呼叫兩次

複製**

而paramcallback是當前引數有幾個處理函式,就呼叫幾次,計數器是paramindex(**101行),每個引數都會清空,例如

// 這個userid只有乙個處理函式,paramcallback只會呼叫一次

// 這個userid有兩個處理函式,paramcallback會呼叫兩次

複製**

我們可以通過例子具體講解param()和paramcallback()的遞迴

複製**

上面這個例子裡,按時間順序

複製**

上面這個例子裡,按時間順序

具體實現可以看**

漸進式Express原始碼學習2 道士下山

這是漸進式express原始碼學習 小白也能懂原始碼系列文章的第二篇。請結合該節 閱讀lesson2 道士下山 這篇文章我們在第一篇文章的基礎上,實現乙個稍微加強版的express,功能包括 具體的用法如下 我們用my express表示這個框架 const express require inde...

漸進式Express原始碼學習3 初露鋒芒

這是漸進式express原始碼學習 小白也能懂原始碼系列文章的第三篇。請結合該節 閱讀lesson3 初露鋒芒 這篇文章我們在第二篇文章的基礎上,實現乙個稍微加強版的express,功能包括 具體的用法如下 先展示下目前的專案結構 和上篇文章不同的是,我們引入了route.js。目前原始檔總共有三個...

漸進式Express原始碼學習5 全副武裝

這是漸進式express原始碼學習 小白也能懂原始碼系列文章的第五篇。請結合該節 閱讀lesson5 全副武裝 這篇文章我們在第四篇文章的基礎上,實現乙個稍微加強版的express,功能包括 這篇文章要實現的express的期望用法如下 const express require index.js ...