Express-及中介軟體的簡單理解
Express
Express 是一個基於node平臺,保持最小規模的靈活的 Node.js Web 應用程式開發框架,在Node.js基礎上擴充套件對了web應用開發所需要的基礎功能為 Web 和移動應用程式提供一組強大的功能。
首先安裝express:
cnpm install express -g
其次:通過express-generator可以快速的幫我們搭建一個應用的骨架。
npm install express-generator -g
輸入命令:express -e,搭建骨架。
1 //引入模組 2 const express = require('express');3 //app:express的返回值,express的例項 4 const app = express() 5 //get請求 6 app.get('/', (req, res) => res.send('Hello World!')) //傳送一個helloword 7 app.listen(3000)
Express使得我們開發Web應用更加快捷、方便。
舉一個例子:
用node.js在控制檯打印出一個"你好"。
1 var http = require("http"); 2 http.creatServer((req,res)=>{3 console.log("你好"); 4 }).listen(6666);
這樣,當我們處理各種資料傳送請求時,需要將所有請求的處理程式碼寫在creatSercer包裹的函式裡。
而用Express實現在控制檯打印出一個"你好"。
1 var express = require("express"); 2 var http = require("http"); 3 var app = express(); 4 http.creatServer(app); 5 //處理使用者請求(路由) 6 app.get("/",()=>{7 console.log("你好"); 8 })
Express處理各種資料傳送請求是通過Express執行函式去呼叫對應的方法,其實也是執行express()後,會返回一個函式,賦值給app,app就是express,然後請求都會被app這個函式所處理,可以這樣認為,在express內部,有一個函式的陣列,每一次來一個請求,express內部就會執行這個陣列中滿足條件的函式,而app.ues就是用來使用中介軟體的。
中介軟體
說到中介軟體,官網對他的闡述是這樣的:
“Express是一個自身功能極簡,完全是路由和中介軟體構成一個web開發框架:從本質上來說,一個Express應用就是在呼叫各種中介軟體”。由此可見中介軟體在Express開發中的重要性,可能官網所說的比較官方,那麼來舉個例子:
可以想象一下我們租房時遇到的房產中介,他會給我們提供一些資訊,他所處的角色是介於房主與我們之間,他的作用就是會帶我們看房等我所請求的要求,而他的作用,就相當於中介軟體的作用,就相當於伺服器的請求和回覆之間,租客和房東之間。
簡單來說,由於在用node api進行http請求的處理時要求引入很多的模組,類似於url模組、fs模組等等,並且在對http請求做處理時需要很多重複但不是邏輯上的操作,所以就會出現已經幫你封裝好的中介軟體,讓你不再耗費時間在資料處理和異常處理上,這樣可以大大減少程式碼量,邏輯更清晰,具有便捷高效的擴充套件性。
而中介軟體主要解決了什麼問題呢?
它主要是拓展了一些res、req的方法。這些方法可以去幫我們解決一些複雜的,需要自己去解決的問題。因此我就來總結一下中介軟體。
一、中介軟體的結構
app.use([path],function)
path:是路由的url,預設引數為"/",意義是路由到這個路徑是使用這個中介軟體,這個引數為需要的時候寫不需要的時候可以不寫。
function:中介軟體函式,這個函式可以理解為:function(req,res,next)
自上面的結構中,我們瞭解了中介軟體使用時的第二個引數是一個函式,而這個函式擁有三個引數(req,res,next);那麼下面我們了來說一下這三個引數的作用。
當每個請求到達伺服器時,nodejs會為了某個請求而去建立一個請求物件(req),該請求物件包含客戶端提交上來的資料,同時也會建立一個響應物件(res),響應物件主要負責將伺服器的資料響應到客戶端。
而最後一個引數next是一個方法,因為開發一個專案需要使用到多箇中間件,而想要執行下一個中介軟體,那麼上一個中介軟體必須執行next(),如果沒有呼叫next()的話,就不會呼叫下一個函數了,也就是說呼叫會被終止,再一次來舉個栗子:
1 app.use((req,res,next)=>{ 2 console.log('111'); 3 next(); 4 console.log('222'); 5 }) 6 app.use((req,res,next)=>{ 7 console.log('333'); 8 next(); 9 });
控制檯輸出的順序為:111 333 222
二、中介軟體的分類
1、內建的中介軟體
express.static 是Express目前唯一的內建中介軟體,它基於serve-static,用來處理靜態資原始檔,它有兩個引數,引數root是指提供靜態資源的根目錄,可選的options引數擁有如下屬性。
2、第三方中介軟體
Express是一款提供路由和中介軟體的Web框架,但其本身的功能卻異常精簡,Express應用的功能通過第三方中介軟體來新增。
有關第三方中介軟體,分析幾個比較重要和常用的。
body-parser:解析body中的資料,並將其儲存為Request物件的body屬性。
cookie-parser:解析body中的資料,並將其儲存為Request物件的cookie屬性。
express-session:解析服務端生成的sessionid對應的session資料,並將其儲存為Request物件的session屬性。
query:這個中介軟體,將一個查詢字串從URL轉換為JS物件,並將其儲存為Request物件的query屬性。
如果這樣不好理解的話,中介軟體也可以這樣分為三大類:
1>pre-request —— 通常用來該項reques的原始資料
2>reqest(請求)、response(響應) —— 大部分中介軟體都在這裡,為req、res的拓展方法,功能各異。
3>post-response —— 全域性異常處理,改寫response資料等。
三、中介軟體的理解
最後,我們再來分析一下從瀏覽器位址列輸如url到客戶端顯示資料之間這個過程到底發生了什麼。
瀏覽器向伺服器傳送了一個請求後,伺服器首先收到req的資料請求,然後服務端進行處理,處理完了之後傳送res響應回去,這中間就一定有一個函式將這些資料做了處理,這個處理資料的函式,就是中介軟體,而中介軟體執行的順序就是你定義的順序。由此可見,中介軟體可以這麼理解:
1、封裝了一些處理一個完整事件的功能函式。
2、非內建的中介軟體需要通過安裝後,req到檔案就可以執行。
3、封裝了一些複雜但肯定通用的功能。