一,開篇分析
截止到今天來說,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),通過上述的幾個中間件例子,了解用途和使用場景并且參考相關文檔掌握其餘中間件的基本使用。
哈哈哈,本篇結束,未完待續,希望和大家多多交流夠溝通,共同進步。。。。。。呼呼呼……(*^__^*)