node——connect模塊源碼解析

參考視頻: Node for Beginners 之 connect

來习柠,分析源碼前匀谣,我們先看看幾個概念!

首先, 一個http請求從客戶端傳到了服務器资溃,接下來要怎么樣武翎?當然是處理這個請求啊喂!如果不用connect模塊溶锭,直接用一個簡單粗暴的回調函數: http.createServer(func).listen(8888);console.log('Server is running...'); 服務器受到來自客戶端的請求宝恶,然后執(zhí)行func(req, res) {...}這樣一個回調函數。

咦趴捅,好像是OK的呢垫毙。然而,有個簡單粗暴的問題: 如果這個回調函數異常復雜呢拱绑,邏輯很長综芥,重點是它內部也有很多一系列串聯的事情要執(zhí)行呢?這時候你還籠統的刀耕火種自己寫猎拨,就out啦膀藐,這就是為什么我們要組件化,模塊化嘛——也就是connect存在的意義啦红省!

再來额各,看一下什么是中間件:我們把早上起床從家去到公司這件事當成一個任務,你要先出家的大門类腮,然后出小區(qū)的大門,再然后走大道過馬路蛉加,到達公司的寫字樓大廳蚜枢,然后再到達你公司的具體門牌號≌爰ⅲ看到了沒有厂抽,你從家去公司是可以拆分為這樣一個由5個小過程組成的一件事,那么就有 a丁眼,b筷凤,c,d,e這5個中間件藐守,以a為例挪丢,它包含三個要素,一是我的起點在哪(床上)卢厂,二是我的終點在哪(家的大門)乾蓬,三是我的下一部是誰(b中間件), 類似,其他中間件也如此慎恒。a的具體內部實現任内,就是定義實現怎樣從床上到出家的大門的過程。

最后融柬,我們要理清楚死嗦,到底什么叫做“服務器接收到了客戶端的請求后處理請求”。這個概念很重要粒氧,很有可能這個細節(jié)的理解有小問題越除,會導致對整個connect模塊的理解都很疑惑。打個比方靠欢,你去餐廳對服務員說廊敌,給我來一桶油漆兩個刷子。現實中的服務員會告訴你我們是餐廳不是五金店门怪,他收到了請求骡澈,但是不會有反應。對應的node世界里面的服務員(服務器)沒感覺掷空,不會理你的肋殴。你只有點餐,點他們店里有的東西坦弟,他才有反應啊喂护锤!也就是說,服務器提供了一系列你可以訪問的東西酿傍,也定義了一系列它會做處理會響應的請求烙懦,如果服務器就只對index.html和about.html這兩個請求定義了響應,你如果請求hello.html赤炒,服務器是會處理你的請求的氯析,但是處理的結果就是沒反應,因為服務器根本沒準備要對任何其他的請求做出反應莺褒。所以掩缓,“服務器接收到了客戶端的請求后處理請求”的概念是說,服務器接收到了你正確 的請求遵岩,即你辣,不僅接收到了,且內部有對此請求的響應的定義。

來舍哄,現在把引入connect模塊宴凉,讓程序run起來先!

var connect = require('connect');
var http = require('http');
var app = connect();

function doFirst(request, response, next) {    
    console.log("bacon");    
    next();
}
function doSecond(request, response, next) {    
    console.log("tuna");    
    next();
}

app.use(doFirst);
app.use(doSecond);

http.createServer(app).listen(8888);
console.log('Server is running...');
  1. 首先引入依賴的模塊蠢熄,var app = connect(); app內部自身有use方法和handle方法跪解。
  2. 使用app.use,將兩個中間件函數注冊到app的內部隊列stack數組里签孔。簡單說叉讥,就是找個地方依次放好中間件函數。
  3. 使用http.createServer(app).listen(8888);創(chuàng)建服務器并監(jiān)聽8888端口〖⒆罚現在只是有服務器run起來了图仓,但是客戶端還沒發(fā)起鏈接動作呢。所以只是打印了'server is running'這句話但绕。并沒有打印別的救崔。
  4. 來,現在快來瀏覽器地址欄敲下localhost:8888捏顺,大力按下回車鍵~啪六孵!好,客戶端請求發(fā)給服務器了幅骄。
  5. 現在服務器也收到請求了劫窒,開始響應,也就是運行這里的app函數拆座。
  6. app調用內部的handle()方法主巍,handle干了什么事情呢:次執(zhí)行之前用app.use注冊到Stack數組里的一系列的中間件函數。

最開始的初衷是貼上connect.js的源碼挪凑,分析內部實現的孕索,實在太長而且瑣碎,取其瑣碎取其精華躏碳,抽取出主要部分搞旭,也就濃縮成以上的過程了。其中中間還有個比較重要的內容就是stack數組里面一條一條的到底是什么菇绵,里面還涉及到route和path肄渗,以后有心情的時候我再補寫吧。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末脸甘,一起剝皮案震驚了整個濱河市恳啥,隨后出現的幾起案子偏灿,更是在濱河造成了極大的恐慌丹诀,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異铆遭,居然都是意外死亡硝桩,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門枚荣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碗脊,“玉大人,你說我怎么就攤上這事橄妆⊙昧妫” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵害碾,是天一觀的道長矢劲。 經常有香客問我,道長慌随,這世上最難降的妖魔是什么芬沉? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮阁猜,結果婚禮上丸逸,老公的妹妹穿的比我還像新娘。我一直安慰自己剃袍,他們只是感情好黄刚,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著笛园,像睡著了一般隘击。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上研铆,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天埋同,我揣著相機與錄音,去河邊找鬼棵红。 笑死凶赁,一個胖子當著我的面吹牛,可吹牛的內容都是我干的逆甜。 我是一名探鬼主播虱肄,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼交煞!你這毒婦竟也來了咏窿?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤素征,失蹤者是張志新(化名)和其女友劉穎集嵌,沒想到半個月后萝挤,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡根欧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年怜珍,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凤粗。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡酥泛,死狀恐怖,靈堂內的尸體忽然破棺而出嫌拣,到底是詐尸還是另有隱情柔袁,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布异逐,位于F島的核電站瘦馍,受9級特大地震影響,放射性物質發(fā)生泄漏应役。R本人自食惡果不足惜情组,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望箩祥。 院中可真熱鬧院崇,春花似錦、人聲如沸袍祖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蕉陋。三九已至捐凭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凳鬓,已是汗流浹背茁肠。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缩举,地道東北人垦梆。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像仅孩,于是被迫代替她去往敵國和親托猩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內容