express中的中間件理解
express是輕量靈活的node.js Web應用框架”。它可以幫助你快速搭建web應用。express是一個自身功能極簡,完全是由**路由**和**中間件**構成的一個web開發框架,本質上說,一個express應用就是在調用各種中間件。路由想必大家都有一定的理解,比較陌生的是中間件。那麽什麽是中間件呢?我在查閱了資料之後把自己的理解分享出來,和大家交流。
##### 一、中間件是什麽?
中間件(MiddleWare)可以理解為一個對用戶請求進行過濾和預處理的東西,它一般不會直接對客戶端進行響應,而是將處理之後的結果傳遞下去。其實它就是相當於一個過濾器類似於javeEE中的`filter`。
其實,express中的中間件是使用了Connect中間件框架。(Connect是一個中間件框架它的作者與express的作者是同一個人)在3.0的版本中express是包含了Connect的中間件,而在最新的4.0版本中express不再依賴Connect,而且從內核中移除了除`express.static`外的所有內置中間件。也就是說現有的express是一個獨立的路由和中間件web框架,express的版本升級不再受中間件更新的影響。如果你需要這些中間件需要顯示的添加。步驟如下:
1、 安裝模塊:npm install --save <module-name>
2、 在應用中引入模塊:require(‘module-name‘)
3、 按照文檔的描述使用模塊:app.use( ... )
更多中間件請查閱官方文檔: [中間件](http://www.expressjs.com.cn/guide/migrating-4.html)
##### 二、中間件分類
我們可以將根據中間件在整個http處理流程的位置將Connect中間件分為三大類方便記憶。
1、 **pre-request** 通常用來該項request的原始數據
2、 **request、response**大部分中間件都在這裏,功能各異。
3、 post-response全局異常處理,改寫response數據等
![網友luics的分類](//upload-images.jianshu.io/upload_images/2070541-f8d7d4ff47615e7e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
##### 三、使用中間件有什麽好處?
由於我們知道在用原生node api進行`http`請求的處理時要求引入許多模塊類似於`url`、`fs`等。並且在對`http`請求做處理時需要很多重復且不是邏輯上的操作,所以就會出現已經幫你封裝好的處理操作,讓你不再耗費時間在數據處理和異常處理上。這樣能夠大大減少代碼量,使得邏輯更加清晰,具有便捷高效的擴展性。
##### 四、了解原理-自己寫中間件
最基本的中間件結構如下:
```
function myFunMiddleware(request, response, next) {
// 對request和response作出相應操作
// 操作完畢後返回next()即可轉入下個中間件
next();
}
```
接下來寫兩個中間件:
```
var express = require(‘express‘)
var app = express();
// 01
function middle01(req,res,next){
req.name = ‘luoqian‘
next();
}
//02
function middle02(){
var accessNum = 0;
return function(req,res,next){
accessNum +=1;
req.accessNum = accessNum
next();
}
}
app.use(middle01);
app.use(middle02());
app.get(‘/‘,function(req,res){
res.send(req.name + ‘\n‘ + "網站訪問人數" + req.accessNum);
})
app.listen(3000);
```
在這裏寫了兩個中間件
第一個是為每一個`req`請求添加一個`name`屬性
第二個它本身不是中間件實體,當執行它時,會return一個中間件函數,屬於一個閉包,它的作用是每次有請求時,都會給`req`請求對象加入一個`accessNum` 屬性,這個屬性每次都會 +1 。
當我刷新網頁八次之後的結果:
![](//upload-images.jianshu.io/upload_images/2070541-c04b3759536d34d3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
參考資料:
[express與Connect簡介](http://www.cnblogs.com/luics/archive/2012/11/28/2775206.html)
[深入理解 Express.js](http://blog.jobbole.com/41325/)
express中的中間件理解