express 原始碼閱讀之封裝Router

2021-09-11 09:53:16 字數 2938 閱讀 2752

console.log(1);

next();

},function(req,res,next)).get('/',function(req,res,next)).get('/',function(req,res,next));

控制台列印出來的結果是:1,11,2,3

複製**

首先expross.js裡面

();複製**

//實現router和應用的分離

}複製**

router資料夾裡的index.js裡面**如下:

const route=require("./route");

const url=require("url");

const layer=require("./layer");

const methods=require("methods");

const slice=array.prototype.slice;

function

router

()//建立乙個route例項,向當前路由系統中新增乙個層

router.prototype.route=function(path)

methods.foreach(function(method)

return this;

})router.prototype.handle=function(req,res,out)=url.parse(req.url,true);

function

next

() let layer=self.stack[idx++];

//值匹配路徑router.stack

if(layer.match(pathname)&&layer.route&&layer.route.handle_method(req.method.tolowercase()))else

}}複製**

1.建立乙個router物件初始化router.stack第一層是個空陣列

2.建立乙個route例項,向當前路由系統新增一層,router layer 路徑 處理函式(route.dispath) 有乙個特殊的route屬性,route layer 路徑 處理函式(真正的業務**) 有一特殊的屬性method,把第一層的路由路徑(path)、對應方法(method)、函式(handle)放入到router.stack中

3.methods動態匹配方法,return this是方便鏈式呼叫

4.router原型上handle方法有3個引數請求(req)、響應(res)、out(上面的done方法),內部定義了索引idx=0,和儲存了this,定義了個pathname變數解構請求的url位址,定義了next函式主要作用是判斷是否繼續下個路由層,next內部只匹配路徑router.stack(判斷method是否匹配),如果匹配就執行route.layer當前路由的第二層,否則就退出當前路由匹配下乙個路由層

router資料夾裡的route.js裡面**如下:

const layer=require("./layer");

const methods=require("methods");

const slice=array.prototype.slice;

function route(path);

}route.prototype.handle_method=function(method)

methods.foreach(function(method)

return this;//方便鏈式呼叫

}})route.prototype.dispath=function(req,res,out)

let layer=this.stack[idx++];

if(layer.method==req.method.tolowercase())else

}next();

}module.exports=route;

複製**

1.這裡的route.stack存的是當前路由的第二次

2.route原型上的dispath方法主要是判斷是否執行當前路由中的下個函式,匹配的是方法名是否一樣。如果不匹配同樣是跳過當前路由找下一層路由來匹配

router資料夾裡的layer.js裡面**如下:

function layer(path,handler)

//判斷這一層和傳入的路徑是否匹配

layer.prototype.match=function(path)

layer.prototype.handle_request=function(req,res,next)

複製**

layer裡主要儲存了path和根據不同情況傳過來的handle函式,原型上match方法是匹配當前層和傳入的路徑是否匹配,而原型上handle_request是執行傳過來的handle函式,也是為了後期擴充套件做準備。

好了,個人理解寫完了,如有理解有誤的地方,熱烈歡迎指正。

敬請期待中介軟體(use)原理的解讀~~~嘻嘻

原始碼閱讀 Glide原始碼閱讀之with方法(一)

前言 本篇基於4.8.0版本 原始碼閱讀 glide原始碼閱讀之with方法 一 原始碼閱讀 glide原始碼閱讀之load方法 二 原始碼閱讀 glide原始碼閱讀之into方法 三 大多數情況下,我們使用glide 就一句 但是這一句 裡面蘊含著成噸的 with方法有以下幾個過載方法 publi...

原始碼閱讀 Glide原始碼閱讀之load方法(二)

原始碼閱讀 glide原始碼閱讀之load方法 二 原始碼閱讀 glide原始碼閱讀之into方法 三 首先,load方法有以下幾個過載方法 public requestbuilder load nullable bitmap bitmap public requestbuilder load nu...

《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具

檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...