中間件(Middleware)可以理解為一個對用戶請求進行過濾和預處理的東西,它一般不會直接對客戶端進行響應,而是將處理之后的結果傳遞下去。
Express支持的中間件
在express官網中可以看出express本身支持若干中間件:
- basicAuth:基本的身份認證功能,處理之后可以通過req.user屬性訪問被認證的用戶對象
- bodyParser:完成請求體消息的三種轉換功能:json(),urlencoded(),multipart(),這三個中間件可以分別使用,而bodyParse是對三者的統一封裝
- compress:對response數據進行壓縮處理
- cookieParser:對Cookie頭進行處理,然后通過req.cookies屬性來訪問所有cookie對象
- cookieSession:提供對Session的支持。我們知道大部分的服務器Session其實是通過cookie來實現的。服務器端通過判斷客戶端發送的兩次請求中某一個cookie項的值是否相同來認定是否是同一個session。處理之后可以通過req.session屬性訪問session對象
- csrf:對CSRF(跨域請求偽造)保護的支持。CSRF是指偽造他人請求發送給受攻擊的站點。其防御方法有驗證HTTP Refer字段;在請求地址中添加token並進行驗證;在HTTP頭中自定義屬性並進行驗證等等。該中間件就是通過生成token來解決的,生成的token可以通過req.csrfToken()來進行訪問
- directory:使服務器的某項目錄能夠為外界所訪問
Connect中間件框架
其實,express中的中間件就是使用了Connect中間件框架。它們是一種包含關系。此外,Connect和Express其實是同一個作者。
connect支持的中間件就非常多了。從主頁中就可以看出:

其使用方法跟express中中間件的使用方法如出一轍,只是多了一些中間件而已。
園友luics將Connect中間件分為了三個部分:
- Pre-Request 通常用來改寫request的原始數據
- Request/Response 大部分中間件都在這里,功能各異
- Post-Response 全局異常處理,改寫response數據等

自己編寫中間件
中間件函數作為插件被放到請求流中(request flow),在Connnect里使用 connect.use(),或在express中使用app.use()。一個自定義的中間件模塊需要返回一個方法,這個方法理想情況下接受 req,res或next三個參數。
module.exports = function() { return function(req, res, next) { // Do Something to `req' or `res' // Pass to next middleware return next(); // Error occurred and pass to error handler return next(err); // Intercept the request and make response directly without pass to next middleware return res.send(XXX); // Hook on `res.end' to perform some decoration on response var end_ = res.end; res.end = function (text) { // Do something to response data ... end_.bind(this)(arg1, arg2, ...); }; } }
參考資料:
http://www.cnblogs.com/luics/archive/2012/11/28/2775206.html
