參考視頻: 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...');
- 首先引入依賴的模塊蠢熄,
var app = connect();
app內部自身有use方法和handle方法跪解。 - 使用
app.use
,將兩個中間件函數注冊到app的內部隊列stack數組里签孔。簡單說叉讥,就是找個地方依次放好中間件函數。 - 使用
http.createServer(app).listen(8888);
創(chuàng)建服務器并監(jiān)聽8888端口〖⒆罚現在只是有服務器run起來了图仓,但是客戶端還沒發(fā)起鏈接動作呢。所以只是打印了'server is running'這句話但绕。并沒有打印別的救崔。 - 來,現在快來瀏覽器地址欄敲下
localhost:8888
捏顺,大力按下回車鍵~啪六孵!好,客戶端請求發(fā)給服務器了幅骄。 - 現在服務器也收到請求了劫窒,開始響應,也就是運行這里的app函數拆座。
- app調用內部的handle()方法主巍,handle干了什么事情呢:次執(zhí)行之前用app.use注冊到Stack數組里的一系列的中間件函數。
最開始的初衷是貼上connect.js的源碼挪凑,分析內部實現的孕索,實在太長而且瑣碎,取其瑣碎取其精華躏碳,抽取出主要部分搞旭,也就濃縮成以上的過程了。其中中間還有個比較重要的內容就是stack數組里面一條一條的到底是什么菇绵,里面還涉及到route和path肄渗,以后有心情的時候我再補寫吧。