寫一個最簡陋的node框架(2)

寫一個最簡陋的node框架(1)node

代碼已提交到githubgit

若是咱們想給一個url匹配相應的路由,咱們會關注兩點,請求的url和請求的http方法。 而以前的寫法把這兩個地方寫死了,不利於擴展。github

因此此次調整了API正則表達式

class rabbit{ 

  ...
  
  router(method,pathReg,callback) {
        let obj = {
            method,
            pathReg,
            callback
        }
        this.routerArr.push(obj)
    }  
}

複製代碼

rabbit是我給框架起的名稱。 用router函數rabbit對象中註冊路由函數函數。路由函數前兩個參數methodpathReg來進行匹配。node http模塊定義的http方法有33種,我看是沒法使用以前的相似於app.get()這種API來寫了,索性當作一個參數傳遞。 路由函數第二個參數是 pathReg,是利用正則表達式匹配url,在rabbit內部,會用pathReg.test(req.url.split("?")[0])來判斷是否匹配路由。數組

路由函數會把用戶註冊的匹配規則推到this.routerArr這個數組,並在以這種方式被調用bash

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請求的流程是:app

一個示例:框架

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}}的請求函數

相關文章
相關標籤/搜索