NodeJS學(xué)習(xí)筆記之Connect中間件模塊(一)
希望大家能夠堅(jiān)持看下去我這系列的文章,這也是對(duì)我的最大的鼓勵(lì)與支持,讓我們共同進(jìn)步,以文會(huì)友,相互幫助。好了直接進(jìn)入今天的主題,
什么是“Connect”,中間件又當(dāng)如何理解,帶著問(wèn)題來(lái)看今天的文章。
如何理解 "中間件" ?
我的理解是這樣的,中間件就是類似于一個(gè)過(guò)濾器的東西,在客戶端和應(yīng)用程序之間的一個(gè)處理請(qǐng)求和響應(yīng)的的方法。
如果把一個(gè)http處理過(guò)程比作是污水處理,中間件就像是一層層的過(guò)濾網(wǎng)。每個(gè)中間件在http處理過(guò)程中通過(guò)改寫(xiě)request或(和)response的數(shù)據(jù),
狀態(tài),實(shí)現(xiàn)了特定的功能。
什么是 ”Connect“ ?
我們可以把Connec看做一堆中間件的集合。對(duì)于每一次請(qǐng)求,Connect將會(huì)使用中間件層來(lái)過(guò)濾請(qǐng)求,其中每一個(gè)中間件都可以獲取HTTP請(qǐng)求。
T.J Holowaychuk談到Connect時(shí),他說(shuō)一共有兩種類型的中間件。其中一種是過(guò)濾器:
過(guò)濾器處理請(qǐng)求,但是他們并不針對(duì)請(qǐng)求進(jìn)行回應(yīng)(想想服務(wù)器日志)。
第二種類型是供應(yīng)器,它會(huì)針對(duì)請(qǐng)求進(jìn)行回應(yīng),你可以根據(jù)你的需求使用多個(gè)中間件,Http請(qǐng)求將會(huì)通過(guò)每一個(gè)中間件直到其中一個(gè)中間件對(duì)請(qǐng)求進(jìn)行回應(yīng)。
二,Connect內(nèi)置中間件介紹
下面列舉出幾個(gè)主要的中間件,并且實(shí)例講述:
(1),cookieParser------cookie解析中間件,解析Cookies的頭通過(guò)req.cookies得到cookies。還可以通過(guò)req.secret加密cookies。
var connect = require('./lib/connect') ;
var app = connect()
.use(connect.cookieParser('secret string'))
.use(function (req,res,next){
req.cookies.website="hi,i am bigbear !" ;
res.end(JSON.stringify(req.cookies)) ;
}).listen(8888) ;
(2),session
描述:會(huì)話管理中間件
依賴:cookieParser
參數(shù):options
options:
key:Cookies名,默認(rèn)值為connect.sid
store: session存儲(chǔ)實(shí)例
secret: session的cookie加密
cookie: session的cookie配置,默認(rèn)值為{path: ‘/', httpOnly: true, maxAge: null}
proxy:安全cookie的反向代理,通過(guò)x-forwarded-proto實(shí)現(xiàn)
Cookie option:
cookie.maxAge: 默認(rèn)值null,表示當(dāng)瀏覽器關(guān)閉后cookie被刪除。
var connect = require('./lib/connect');
var app = connect()
.use(connect.logger('dev'))
.use(connect.cookieParser())
.use(connect.session({secret: '123', cookie: { maxAge: 60000 }}))
.use(function (req, res, next) {
if(req.session.pv){
res.setHeader('Content-Type', 'text/html');
res.write('views: ' + req.session.pv);
res.end();
req.session.pv++;
}else{
req.session.pv = 1;
res.end('Refresh');
}
})
.listen(8888);
隨著客戶端不斷刷新頁(yè)面 "PV" 會(huì)不斷增加,服務(wù)器端 “Session” 維護(hù)數(shù)量 。
(3),bodyParser------請(qǐng)求內(nèi)容解析中間件,支持多種類型application/json,application/x-www-form-urlencoded, multipart/form-data?! ?/p>
var connect = require('connect');
var app = connect()
.use(connect.bodyParser())
.use(function(req, res) {
res.end('req.body=>' + JSON.stringify(req.body));
})
.listen(8888);
三,再來(lái)個(gè)對(duì)比實(shí)例,看看使用中間件的好處。
/*
* 使用connect實(shí)現(xiàn)的靜態(tài)文件處理
*/
var connect = require('connect');
connect(connect.static(__dirname + '/public')).listen(//監(jiān)聽(tīng)
8888,
function() {
console.log('Connect started on port 8888');
}
);
/*
* 使用node原生api實(shí)現(xiàn)
*/
var http = require('http');
http.createServer(
function(req, res) {
var url = require('url');
var fs = require('fs');
var pathname = __dirname + '/public' + url.parse(req.url).pathname;
//讀取本地文件
fs.readFile(
pathname,
function(err, data) {
//異常處理
if (err) {
res.writeHead(500);
res.end('500');
}
else {
res.end(data);
}
}
);
}
).listen(//監(jiān)聽(tīng)
8888,
function() {
console.log('Http Server started on port 8888');
}
);
盡管node原生api已經(jīng)花費(fèi)這么些行代碼,但其實(shí)仍然留下一個(gè)簡(jiǎn)單靜態(tài)文件服務(wù)器的諸多方面未經(jīng)處理,
比如:404等異常未處理、沒(méi)有基本的文件路徑安全驗(yàn)證(實(shí)際上我們可以訪問(wèn)到整個(gè)os文件系統(tǒng))、全局異常處理等等;
與此同時(shí)connect已經(jīng)將這些問(wèn)題都處理好了。
四,總結(jié)一下
(1),理解中間件流式處理。
var app = connect();
app.use(connect.staticCache());
app.use(connect.static(__dirname + '/public'));
app.use(connect.cookieParser());
app.use(connect.session());
app.use(connect.query());
app.use(connect.bodyParser());
app.use(connect.csrf());
app.use(function (req, res, next) {
// 中間件
});
app.listen(8888);
(2),原生實(shí)現(xiàn)方式與中間件實(shí)現(xiàn)之間的差異化。
(3),通過(guò)上述的幾個(gè)中間件例子,理解用途和使用場(chǎng)景并且參考相關(guān)文檔掌握其余中間件的基本使用。
相關(guān)文章
Node環(huán)境中JS代碼缺少window對(duì)象的原因和解決方案
你可能會(huì)在某些情況下需要在Node環(huán)境下運(yùn)行JavaScript代碼,但你也可能會(huì)遇到一個(gè)常見(jiàn)的問(wèn)題:缺少window環(huán)境,在本文中,我們將深入探討這個(gè)問(wèn)題的原因,并提供解決方案,需要的朋友可以參考下2023-08-08使用?Node-RED對(duì)?MQTT?數(shù)據(jù)流處理
本文將介紹使用 Node-RED 連接到 MQTT 服務(wù)器,并對(duì) MQTT 數(shù)據(jù)進(jìn)行過(guò)濾和處理后再將其發(fā)送至 MQTT 服務(wù)器的完整操作流程。讀者可以快速了解如何使用 Node-RED 對(duì) MQTT 數(shù)據(jù)進(jìn)行簡(jiǎn)單的流處理2022-05-05快速掌握Node.js環(huán)境的安裝與運(yùn)行方法
這篇文章主要介紹了Node.js環(huán)境的安裝與運(yùn)行方法,Node是基于Google Chrome V8引擎的JavaScript解釋器,需要的朋友可以參考下2016-02-02使用nodejs連接mySQL寫(xiě)接口全過(guò)程(增刪改查)
這篇文章主要給大家介紹了關(guān)于使用nodejs連接mySQL寫(xiě)接口(增刪改查)的相關(guān)資料,MySQL是一種常用的關(guān)系型數(shù)據(jù)庫(kù),它與Node.js的結(jié)合可以提供強(qiáng)大的數(shù)據(jù)存儲(chǔ)和檢索功能,需要的朋友可以參考下2023-12-12nodemailer郵箱發(fā)送驗(yàn)證碼的實(shí)現(xiàn)
郵箱注冊(cè)是常見(jiàn)的功能,通常需要發(fā)送郵箱驗(yàn)證碼驗(yàn)證,本文就來(lái)介紹一下nodemailer郵箱發(fā)送驗(yàn)證碼的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10node.js中的events.emitter.removeAllListeners方法使用說(shuō)明
這篇文章主要介紹了node.js中的events.emitter.removeAllListeners方法使用說(shuō)明,本文介紹了events.emitter.removeAllListeners 的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12