Node.js實戰(zhàn)_5 Connect 自帶的中間件

??
這一章是《Node.js 實戰(zhàn)》筆記薇宠,但是書中的源碼實現(xiàn)與官方文檔有出入,Connect “自帶”的中間件好像是需要單個獨立導(dǎo)入才能使用。
以下僅作為記錄岂座,實際項目使用待研究驗證。

Connect 自帶的中間件

Connect 自帶的中間件可以滿足常見的Web程序開發(fā)需求:

  • 會話管理杭措;
  • cookie 解析费什;
  • 請求主體解析
  • 請求日志
  • ...

下面的這些中間件是獨立呈現(xiàn)的,需要npm單獨導(dǎo)入

Connect 中間件
image

解析 cookie手素、請求主體和查詢字符串的中間件

cookieParser():解析HTTP cookie

Connect 的 cookie 解析器支持常規(guī)cookie鸳址、簽名cookie和特殊的JSON cookie。
req.cookies默認(rèn)是用常規(guī)未簽名cookie組裝而成的泉懦。如果你想支持session()中間件要求的簽名cookie稿黍,在創(chuàng)建cookieParser()實例時要傳入一個加密用的字符串。

const connect = require('connect');

// 作為參數(shù)傳給cookieParser()的秘鑰用來對cookie簽名和解簽
var app = connect()
    .use(connect.cookieParser('tobi is a cook ferret')) 
    .use(function (req, res) {
        console.log(req.cookies);
        console.log(req.signedCookies);
        res.end('hello\n');
    })
    .listen(3000);

// 不帶cookie
// curl http://localhost:3000/

// 常規(guī)cookie
// curl http://localhost:3000/ -H "Cookie: foo=bar, bar=baz"

簽名cookie

簽名cookie更適合敏感數(shù)據(jù)崩哩,因為用它可以驗證cookie數(shù)據(jù)的完整性巡球,有助于防止中間人攻擊。有效的簽名cookie放在req.signedCookies對象中邓嘹。

假設(shè)你設(shè)定了一個鍵為name辕漂,值為luna的簽名cookie。cookieParser會將cookie編碼為luna.PQLM0wNvqOQEObZXUkWbS5m6Wlg吴超。每個請求中的哈希值都會檢查钉嘹,如果cookie完好無損地傳上來,它會被解析為req.signedCookies.name:

JSON cookie

特別的JSON cookie帶有前綴j:鲸阻,告訴Connect它是一個串行化的JSON跋涣。 JSON cookie既可以是簽名的缨睡,也可以是未簽名的。

curl http://localhost:3000/ -H 'Cookie: foo=bar, bar=j:{"foo":"bar"}'

設(shè)定出站cookie

cookieParser() 中間件沒有提供任何通過 Set-Cookie 響應(yīng)頭向HTTP客戶端寫出站cookie的功能陈辱。但Connect可以通過 res.setHeader()函數(shù)寫入多個Set-Cookie響應(yīng)頭奖年。

const connect = require('connect');

var app = connect()
    .use(function (req, res) {
        res.setHeader('Set-Cookie', 'foo=bar'); // 設(shè)定cookie:foo=bar
        res.setHeader('Set-Cookie', 'tobi=ferret; Expires=Tue, 08 Jun 2021 10:18:14 GMT'); // 設(shè)定cookie有效期
        res.end();
    }).listen(3000);

// curl http://localhost:3000/ --head

bodyParser():解析請求主體

bodyParser() 組件為你提供了req.body 屬性,可以用來解析 JSON沛贪、x-www-form-urlencoded 和multipart/form-data請求陋守。如果是 multipart/form-data 請求,比如文件上傳利赋,則還有req.files 對象水评。

var app = connect()
    .use(connect.bodyParser())
    .use(function(req, res) {
        // ...注冊用戶
        res.end('Registered new user: ' + req.body.username);
    }).listen(3000);

因為 bodyParser() 是根據(jù) Content-Type 解析數(shù)據(jù)的,輸入形式是抽象的媚送,所以你的程序中只需要關(guān)心req.body數(shù)據(jù)對象的結(jié)果中燥。

limit():請求主體的限制

目的:幫助過濾巨型的請求。

query():查詢字符串解析

  • bodyParser():解析 POST 請求
  • query():解析 GET 請求塘偎。

query中間件可以將請求發(fā)送過來的查詢字符串以JSON格式作為響應(yīng)返回去疗涉。

實現(xiàn) Web 程序核心功能的中間件

  • logger():提供靈活的請求日志;
  • favicon():幫你處理/favicon.ico請求(favicon 是網(wǎng)站的小圖標(biāo));
  • methodOverride():讓沒有能力的客戶端透明地重寫req.method;
  • vhost():在一個服務(wù)器上設(shè)置多個網(wǎng)站(虛擬主機);
  • session():管理會話數(shù)據(jù)。

處理 Web 程序安全的中間件

  • basicAuth():為保護(hù)數(shù)據(jù)提供了HTTP基本認(rèn)證;
  • csrf():實現(xiàn)對跨站請求偽造(CSRF)攻擊的防護(hù);
  • errorhandler():幫你在開發(fā)過程中進(jìn)行調(diào)試吟秩。

提供靜態(tài)文件服務(wù)的中間件

  • static():將文件系統(tǒng)中給定根目錄下的文件返回給客戶端;
  • compress():壓縮響應(yīng)咱扣,很適合跟static()一起使用;
  • directory():當(dāng)請求的是目錄時,返回那個目錄的列表涵防。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末偏窝,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子武学,更是在濱河造成了極大的恐慌祭往,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件火窒,死亡現(xiàn)場離奇詭異硼补,居然都是意外死亡,警方通過查閱死者的電腦和手機熏矿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門已骇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人票编,你說我怎么就攤上這事褪储。” “怎么了慧域?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵鲤竹,是天一觀的道長。 經(jīng)常有香客問我昔榴,道長辛藻,這世上最難降的妖魔是什么碘橘? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮吱肌,結(jié)果婚禮上痘拆,老公的妹妹穿的比我還像新娘。我一直安慰自己氮墨,他們只是感情好纺蛆,可當(dāng)我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著规揪,像睡著了一般桥氏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上粒褒,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機與錄音诚镰,去河邊找鬼奕坟。 笑死,一個胖子當(dāng)著我的面吹牛清笨,可吹牛的內(nèi)容都是我干的月杉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼抠艾,長吁一口氣:“原來是場噩夢啊……” “哼苛萎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起检号,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤腌歉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后齐苛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翘盖,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年凹蜂,在試婚紗的時候發(fā)現(xiàn)自己被綠了馍驯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡玛痊,死狀恐怖汰瘫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情擂煞,我是刑警寧澤混弥,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站对省,受9級特大地震影響剑逃,放射性物質(zhì)發(fā)生泄漏浙宜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一蛹磺、第九天 我趴在偏房一處隱蔽的房頂上張望粟瞬。 院中可真熱鬧,春花似錦萤捆、人聲如沸裙品。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽市怎。三九已至,卻和暖如春辛慰,著一層夾襖步出監(jiān)牢的瞬間区匠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工帅腌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留驰弄,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓速客,卻偏偏與公主長得像戚篙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子溺职,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容