程式碼已提交到github
如果我們想給一個url匹配相應的路由,我們會關注兩點,請求的url和請求的http方法。
而之前的寫法把這兩個地方寫死了,不利於擴充套件。
所以這次調整了API
class rabbit{
...
router(method,pathReg,callback) {
let obj = {
method,
pathReg,
callback
}
this.routerArr.push(obj)
}
}
複製程式碼
rabbit
是我給框架起的名稱。
用router函式
向rabbit
物件中註冊路由函式函式。路由函式前兩個引數method
和pathReg
來進行匹配。node http模組定義的http方法有33種,我看是無法使用之前的類似於app.get()這種API來寫了,索性當做一個引數傳遞。 路由函式第二個引數是 pathReg
,是利用正規表示式匹配url,在rabbit內部,會用pathReg.test(req.url.split("?")[0])
來判斷是否匹配路由。
路由函式會把使用者註冊的匹配規則推到this.routerArr這個陣列,並在以這種方式被呼叫
for(let router of that.routerArr){
if(router.method.toLocaleLowerCase() == req.method.toLocaleLowerCase()
&& router.pathReg.test(req.url.split("?")[0])){
router.callback(req,res)
break
}
}
複製程式碼
這意味著:每個請求最多匹配一次路由函式,如果多個路由函式都可以匹配到請求的url,先被註冊的路由函式會被執行
整個響應http請求的流程是:
一個示例:
const rabbit = require("./rabbit.js")
let app = new rabbit()
app.router("get",/^/user/[a-zA-Z]+[a-zA-Z0-9]*$/,(req,res)=>{
res.end("hi,world")
})
app.listen(3003)
複製程式碼
這個伺服器可以響應任何方法為get
,url為 /user/{{name}}
的請求