大熊君大話NodeJS之------Connect中間件模塊(第一季)


一,開篇分析

截止到今天來說,NodeJS系列文章已經有將近十篇了,讓我們回顧一下:

(1),大熊君大話NodeJS之開篇------Why NodeJS(將Javascript進行到底)

(2),大熊君大話NodeJS之------Global Objects全局對象

(3),大熊君大話NodeJS之------Net模塊

(4),大熊君大話NodeJS之------Buffer模塊

(5),大熊君大話NodeJS之------Stream模塊

(6),大熊君大話NodeJS之------Http模塊

(7),大熊君大話NodeJS之------FS文件模塊

(8),大熊君大話NodeJS之------(Url,QueryString,Path)模塊

(9),大熊君大話NodeJS之------MongoDB模塊(額外篇)

這是一個目錄概要,里面記錄着NodeJS的基礎知識部分,今天這篇文章以及后續的幾篇,將是一個進階系列,讓我們建立一個由淺入深的學習的過程,

希望大家能夠堅持看下去我這系列的文章,這也是對我的最大的鼓勵與支持,讓我們共同進步,以文會友,相互幫助。好了直接進入今天的主題,

什么是“Connect”,中間件又當如何理解,帶着問題來看今天的文章。

 

 

如何理解 "中間件" ?

我的理解是這樣的,中間件就是類似於一個過濾器的東西,在客戶端和應用程序之間的一個處理請求和響應的的方法。

如果把一個http處理過程比作是污水處理,中間件就像是一層層的過濾網。每個中間件在http處理過程中通過改寫request或(和)response的數據,

狀態,實現了特定的功能。

 

什么是 ”Connect“ ?

我們可以把Connec看做一堆中間件的集合。對於每一次請求,Connect將會使用中間件層來過濾請求,其中每一個中間件都可以獲取HTTP請求。

T.J Holowaychuk談到Connect時,他說一共有兩種類型的中間件。其中一種是過濾器:

過濾器處理請求,但是他們並不針對請求進行回應(想想服務器日志)。

第二種類型是供應器,它會針對請求進行回應,你可以根據你的需求使用多個中間件,Http請求將會通過每一個中間件直到其中一個中間件對請求進行回應。

 

二,Connect內置中間件介紹

 

下面列舉出幾個主要的中間件,並且實例講述:

(1),cookieParser------cookie解析中間件,解析Cookies的頭通過req.cookies得到cookies。還可以通過req.secret加密cookies。

1 var connect = require('./lib/connect') ;
2 var app = connect()
3 .use(connect.cookieParser('secret string'))
4 .use(function (req,res,next){
5     req.cookies.website="hi,i am bigbear !" ;
6     res.end(JSON.stringify(req.cookies)) ;
7 }).listen(8888) ;

(2),session

  描述:會話管理中間件

  依賴:cookieParser

  參數:options

  options:

    key:Cookies名,默認值為connect.sid

    store: session存儲實例

    secret: session的cookie加密

    cookie: session的cookie配置,默認值為{path: ‘/’, httpOnly: true, maxAge: null}

    proxy:安全cookie的反向代理,通過x-forwarded-proto實現

    Cookie option:

    cookie.maxAge: 默認值null,表示當瀏覽器關閉后cookie被刪除。

  

 1 var connect = require('./lib/connect');
 2 var app = connect()
 3 .use(connect.logger('dev'))
 4 .use(connect.cookieParser())
 5 .use(connect.session({secret: '123', cookie: { maxAge: 60000 }}))
 6 .use(function (req, res, next) {
 7     if(req.session.pv){
 8         res.setHeader('Content-Type', 'text/html');
 9         res.write('views: ' + req.session.pv);
10         res.end();
11         req.session.pv++;
12     }else{
13         req.session.pv = 1;
14         res.end('Refresh');
15     }
16 
17 })
18 .listen(8888);

  隨着客戶端不斷刷新頁面 "PV" 會不斷增加,服務器端 “Session” 維護數量 。

 

(3),bodyParser------請求內容解析中間件,支持多種類型application/json,application/x-www-form-urlencoded, multipart/form-data。  

1 var connect = require('connect');
2 var app = connect()
3     .use(connect.bodyParser())
4     .use(function(req, res) {
5         res.end('req.body=>' + JSON.stringify(req.body));
6     })
7 .listen(8888);

 

 

 三,再來個對比實例,看看使用中間件的好處。

  

 1 /*
 2  * 使用connect實現的靜態文件處理
 3  */
 4 var connect = require('connect');
 5 connect(connect.static(__dirname + '/public')).listen(//監聽
 6     8888,
 7     function() {
 8         console.log('Connect started on port 8888');
 9     }
10 );
11 /*
12  * 使用node原生api實現
13  */
14 var http = require('http');
15 http.createServer(
16     function(req, res) {
17         var url = require('url');
18         var fs = require('fs');
19         var pathname = __dirname + '/public' + url.parse(req.url).pathname;
20         //讀取本地文件
21         fs.readFile(
22             pathname,
23             function(err, data) {
24                 //異常處理
25                 if (err) {
26                     res.writeHead(500);
27                     res.end('500');
28                 }
29                 else {
30                     res.end(data);
31                 }
32             }
33         );
34     }
35 ).listen(//監聽
36     8888,
37     function() {
38         console.log('Http Server started on port 8888');
39     }
40 );

盡管node原生api已經花費這么些行代碼,但其實仍然留下一個簡單靜態文件服務器的諸多方面未經處理,

比如:404等異常未處理、沒有基本的文件路徑安全驗證(實際上我們可以訪問到整個os文件系統)、全局異常處理等等;

與此同時connect已經將這些問題都處理好了。

 

 

四,總結一下

 

 (1),理解中間件流式處理。

 1 var app = connect();
 2 app.use(connect.staticCache());
 3 app.use(connect.static(__dirname + '/public'));
 4 app.use(connect.cookieParser());
 5 app.use(connect.session());
 6 app.use(connect.query());
 7 app.use(connect.bodyParser());
 8 app.use(connect.csrf());
 9 app.use(function (req, res, next) {
10   // 中間件
11 });
12 app.listen(8888);

  

 

 

(2),原生實現方式與中間件實現之間的差異化。

 

 

 

(3),通過上述的幾個中間件例子,理解用途和使用場景並且參考相關文檔掌握其余中間件的基本使用。

 

 

 

 

 

              哈哈哈,本篇結束,未完待續,希望和大家多多交流夠溝通,共同進步。。。。。。呼呼呼……(*^__^*)             

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM