關於Express路由,這篇總結的很全面
通常我們在瀏覽器位址列中訪問一個頁面時,HTTP請求的URL格式是這樣的:
http://host[:port][path]
http:表示一種網路協議。
host:表示主機。
port:表示埠,可選欄位,不提供時預設為80。
path:指定請求資源的URI(統一資源識別符號),如果URL中沒有給出path,一般會預設成”/“(通常由瀏覽器或者其它HTTP客戶端完成補上)
然而,所謂路由,就是如何處理HTTP請求中的路徑部分
(比如“http://xxx.com/list/news”這個URL,路由將決定怎麼處理/list/news這個路徑)
app.get(‘/’,callback)
上面這個程式碼我們很熟悉了,表示我們添加了一條路由,指定”/“這個路徑由get的第二個引數所代表的函式callback來處理。
[下面開始講Express路由]
來看一下Express的路由定義規則:
app.verb(path,[callback...],callback)
同樣,對這個定義公式的每個引數說明一下:
1、verb表示方法,可以是get、post、put、delete等,常用的當然就是前面兩個。
2、path表示路徑,可以是一個字串(String),也可以是一個正則表示式(Regex)。
3、callback表示路徑處理函式,裡面有個next方法,可以用next(),也可以用next('router'),下面我會用例項來說明它們的區別。
由上可見,關於verb只要知道url傳送的是get請求和表單可提交post請求資料就行,所以,本篇下面開始就從path和callback兩個點來介紹Express路由的幾乎所有使用規則。
一、路由中的路徑(path)
String:
路徑是字串的情況,舉三個例子:
1、匹配/list
在位址列中輸入:
http://localhost:1234/list
瀏覽器視窗輸出:
This is list
2、匹配/list/news
http://localhost:1234/list/news
This is news
3、匹配/list/news/123
http://localhost:1234/list/news/123
This is list news:123
Regex:
路徑是正則表示式的情況,舉兩個例子:
1、匹配/mobile/1[十個數字]
http://localhost:1234/mobile/1開頭11位數字
This is a mobile ......
2、匹配abcd和acd
http://localhost:1234/abcd
匹配abcd和acd
好了,這些並不難,在舉例子就是講正則表示式了,哈
二、路由中的控制代碼(callback)
有關路由中的控制代碼,這裡我講清楚兩個問題:
1、next()和next('route')
這兩個方法是路由反饋函式自帶的方法。
例項如下圖所示:
有三個位置加了next()或者next('route'),我們這裡只需要講清楚這兩者的區別,我們就只需要關注位置1,為了讓第二個相同路由執行,位置2可以是next(),也可以是next('router'),表示執行下一個相同路由。
通過測試,發現:
當位置1是next()時輸出的是:
1234
當位置1是next('router')時輸出的是:
134
由此可知,當位置1是next()方法時,會先執行下一個callback,當為next('router')時,會直接跳過下一個callback直接執行下一個相同路由。這也就是二者區別。
2、app.param()
app.param在路由中也相當於是一箇中間件的作用,具體看一下下面這個例項:
'listname'的param方法會在’listname‘路由get之前執行。這裡一定要強調listname,因為引數是一一對應的。上面這個新例項將輸出:
list:item0item1item2
比如我們需要通過一個路由引數去取相應的資料,這個時候通常的做法是寫函式來處理,有了param方法後就可以將這些邏輯寫在這個方法裡了。
三、寫到最後總結
當然,Express路由還有一些其它的知識點,比如,app.all(""):能處理任意請求型別,再比如,利用app.route("").get().post().all()實現一個路徑處理多個請求方式。這些感覺不是很常用,沒有做專門的實現總結 ,感興趣的童靴可以自己寫個DEMO測一下。