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可以顯示出類的繼承和實現結構,包括它的父類和...