Express利用HTTP動作提供了有意義並富有表現力的URL映射API,例如我們可能想讓用戶帳號的URL看起來像/user/12
的樣子,下面的例子就能實現這樣的路由,其中與占位標識符(本例為:id)相關的值可以被req.params
獲取到。
URL路徑和參數看起來沒有任何分別,真正的區別在於,將被哪個對象獲取,例如:下面例子和對應的URL:http://..../user/12,user將匹配路徑,12將匹配參數:id,它將被
req.params
對象獲取到。
app.get('/user/:id', function(req, res){ res.send('user ' + req.params.id); });
上例中當我們訪問/user/12
時返回“user 12”。
注:app.get相當於在服務器注冊了一個監聽get請求事件的偵聽器,當請求的URL滿足第一個參數時,執行后面的回調函數,該過程是異步的。
路由是一個可以被內部編譯
成正則表達式
的簡單字符串,比如當/user/:id
被編譯后,被內部編譯后的正則表達式字符串看起來會是下面的樣子(簡化后):
\/user\/([^\/]+)\/?
要實現復雜點的,我們可以傳入正則表達式直接量,因為正則捕獲組是匿名的因此我們可以通過req.params
進行訪問,第一個捕獲組應該是req.params[0]
,第二個應該是req.params[1]
,以此類推。
app.get(/^\/users?(?:\/(\d+)(?:\.\.(\d+))?)?/, function(req, res){ res.send(req.params); });
通過不同的url來測試我們定義的路由:
http://127.0.0.1:3000/users/any
[ null, null ]
http://127.0.0.1:3000/users/12
[ "12", null ]
http://127.0.0.1:3000/users/12..28
[ "12", "28" ]
下面是一些路由例子,以及與之相匹配的關聯路徑:
"/user/:id" /user/12 "/users/:id?" /users/5 /users "/files/*" /files/jquery.js /files/javascripts/jquery.js "/file/*.*" /files/jquery.js /files/javascripts/jquery.js "/user/:id/:operation?" /user/1 /user/1/edit "/products.:format" /products.json /products.xml "/products.:format?" /products.json /products.xml /products "/user/:id.:format?" /user/12 /user/12.json