一、工作原理 當通過瀏覽器訪問app.js建立的伺服器時,會看到一個簡單的頁面,實際上它已經完成了許多透明的工作, 當訪問http://localhost:3000,瀏覽器會向伺服器發送請求,包括請求的方法、路徑、HTTP協議版本和要求標頭資訊。app會解析請求的路徑,調用相應的邏輯,app.js中有app.get("/",routes.index)通過res.render("index",{title:"pcat"})調用視圖模版index,傳遞title變數,最終檢視窗產生HTML頁面,返回給瀏覽器。 瀏覽器接收到內容後,通過分析需要擷取/stylesheets/style.css,因此會再次向伺服器發起請求,app.js並沒有一個路由規則指派到/stylessheets/style.css,但app通過app.use(express.static(__dirname+'/public'))配置了靜態檔案伺服器,因此會定向到app.js所在目錄下的/public/stylessheets/style.css拿去這個檔案。
這是一個典型的MVC架構,瀏覽器發送請求,由路由控制接受,根據不同的路徑定向到不同的伺服器,控制器處理使用者具體的請求,可能會訪問資料庫中的對象,即模型部分,產生視圖的HTML,最後再由控制器返回給瀏覽器,完成一次請求。二、建立路由規則 當我們在瀏覽器訪問http://localhost:3000/octopus的時候,伺服器回應標頭返回HTTP 404錯誤 這是因為/octopus是一個不存在的路由規則,而且它也不是一個public目錄下的檔案,所以響應404 假設我們建立一個/octopus的路由規則。 app.get('/octopus',function(req,res){
res.send('這是 octopus 的路徑');
}); //若我們定義“/octopus的路由規則”兩次,則按照先定義的路由規則走。 app.get("/octopus",routes.octopus); //在index.js中增加函數octopus exports.octopus=function(req,res){ res.send('The time is '+new Date().toString()); } 伺服器在開始監聽之前,設定好了所有的路由規則,當請求到達時直接分配到相應函數。app.get是路由規則建立函數, 參數一:請求的路徑 參數二:是一個回呼函數,該路由規則被觸發時調用回呼函數,並傳遞req(請求資訊)和res(響應資訊)兩個參數。三、路徑匹配 上面講到了為固定的路徑設定路由規則,Express還提供更進階的路徑匹配模式。 1.app.get('/user/:username',function(req,res){ res.send("user :"+req.params.username); }); 路徑規則/user/:username會被自動編譯成Regex,類似於\/user\/([^\/]+)\/?這樣的形式,路徑參數可以相應函數中通過req.params的屬性訪問 2.路徑規則同樣支援javascriptRegex,例如:app.get(\/user\/([^\/]+)\/?,callback),這樣的好處在於可以定義更加複雜的路徑規則,不同支援是配置的參數是匿名的,因此需要通過req.params[0]這樣的形式訪問。四、REST風格的路由規則 Express支援REST風格的請求方式,REST意思是表徵狀態轉移,它是一種基於HTTP協議的網路應用的介面風格,充分利用HTTP的方法實現了統一風格的介面和服務,HTTP協議定義了一下8個標準方法: GET:請求擷取指定的資源 擷取 POST:向指定資源提交資料 新增 DELETE:請求伺服器刪除指定資源 刪除 PUT:請求伺服器儲存一個資源 更新 HEAD:請求指定資源的回應標頭 TRACE:回顯伺服器數到的請求,主要使用者測試或診斷 CONNECT:HTTP/1.1協議中預留給能夠將串連改為管道方式的Proxy 伺服器。 OPTIONS:返回伺服器支援的HTTP要求方法 所謂安全指的是連續訪問多次所獲得的結果不受訪問者的影響。而等冪指的是重複請求多次與一次請求的效果是一樣的,比如擷取、更新和刪除操作是等冪,這與新增不同。 Express對每種HTTP要求方法都設計了不同的路由綁定函數,例如前面全部是app.get,標識該路徑綁定了GET請求,向這個路徑發起其他方式的請求不會被響應。 GET app.get(path,callback) POST app.post(path,callback) PUT app.put(path,callback) DELETE app.delete(path,callback) ... ... 所有方法 app.all(path,callback,next) 怎麼使用? 綁定一個POST請求,可以使用app.post(path,callback)的方法設定路由規則。 app.all函數,它支援把所有的要求方法都綁定到同一個相應函數,是一個非常靈活的函數。五、控制權轉移 Express支援同一路徑綁定多個相應函數 app.all('/test/:user',function(req,res,next){ //我們在這裡驗證使用者名稱是否存在。 //如果存在直接send或者調用next(new Error('使用者已經存在')); //如果不存在我們調用next()把控制權交給下一個路由規則 console.log("all methods is call"); next(); res.send('哈哈'); }); app.get('/test/:user',function(req,res){ res.send("user:"+req.pararms.user) }) 但是我們訪問都會只返回一次。 Exress提供了路由控制權轉移的方法,即next()函數,通過調用則將控制權交給後面的規則。