一,開篇分析html
截止到今天來講,NodeJS系列文章已經有將近十篇了,讓咱們回顧一下:node
(1),大熊君大話NodeJS之開篇------Why NodeJS(將Javascript進行到底)web
(2),大熊君大話NodeJS之------Global Objects全局對象json
(3),大熊君大話NodeJS之------Net模塊api
(4),大熊君大話NodeJS之------Buffer模塊瀏覽器
(5),大熊君大話NodeJS之------Stream模塊安全
(6),大熊君大話NodeJS之------Http模塊服務器
(7),大熊君大話NodeJS之------FS文件模塊cookie
(8),大熊君大話NodeJS之------(Url,QueryString,Path)模塊session
(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),經過上述的幾個中間件例子,理解用途和使用場景而且參考相關文檔掌握其他中間件的基本使用。
哈哈哈,本篇結束,未完待續,但願和你們多多交流夠溝通,共同進步。。。。。。呼呼呼……(*^__^*)