Express全系列教程之(五):Express的中間件

從字面意思秩命,我們可以了解到它大概就是做中間代理操作耘成,事實也是如此慈参;大多數(shù)情況下蘑险,中間件就是在做接收到請求和發(fā)送響應(yīng)中間的一系列操作醋闭。事實上睁搭,express是一個路由和中間件的web框架鹃骂,Express 應(yīng)用程序基本上是一系列中間件函數(shù)的調(diào)用潮模。


中間件函數(shù)可以執(zhí)行以下任務(wù):

執(zhí)行任何代碼改淑。

對請求和響應(yīng)對象進行更改碍岔。

結(jié)束請求/響應(yīng)循環(huán)。

調(diào)用堆棧中的下一個中間件函數(shù)朵夏。


中間件也分為應(yīng)用層中間件蔼啦、路由中間件、內(nèi)置中間件仰猖、錯誤處理中間件和第三方中間件捏肢。下面分別對以下進行說明:

1.應(yīng)用層中間件

應(yīng)用級中間鍵綁定到app對象使用app.use和app.METHOD()-需要處理http請求的方法,例如GET饥侵、PUT鸵赫、POST,將之前的get或者post替換為use就行躏升。

例如下面實例:

const express=require("express");

var app=express();

//匹配路由之前的操作

app.use(function(req,res){

? ??console.log("訪問之前");

});

app.get("/",function(req,res){

? ?res.send("主頁");

});

app.listen(8080);

這時我們會發(fā)現(xiàn)http://localhost:8080/地址一直在加載辩棒,但命令行里顯示了“訪問之前”,說明程序并不會同步執(zhí)行膨疏,如果使用next來是路由繼續(xù)向下匹配一睁,那么就能又得到主頁數(shù)據(jù)了:

const express=require("express");

var app=express();

//匹配路由之前的操作

app.use(function(req,res,next){

? ??console.log("訪問之前");

? ??next();

});

app.get("/",function(req,res){

? ??res.send("主頁");

});

app.listen(8080);

當(dāng)然也可以簡化寫法:

const express=require("express");

var app=express();

app.use(function(req,res,next){

? ??console.log("訪問之前");

? ??next();

},function(req,res){

? ??res.send("主頁");

});

app.listen(8080);

因此,在進行路由匹配之前或再錄又要繼續(xù)向下執(zhí)行時想做個操作佃却,那么應(yīng)用層中間件無疑是好的選擇者吁。


2.路由中間件

路由級中間件和應(yīng)用級中間件類似,只不過他需要綁定express.Router();

var router = express.Router();

在匹配路由時双霍,我們使用 router.use() 或 router.VERB() ,路由中間件結(jié)合多次callback可用于用戶登錄及用戶狀態(tài)檢測砚偶。

const express = require("express");

var app = express();

var router=express.Router();

router.use("/",function(req,res,next){

? ?console.log("匹配前");

? ??next();

});

router.use("/user",function(req,res,next){

? ??console.log("匹配地址:",req.originalUrl);

? ??next();

},function(req,res){

? ??res.send("用戶登錄");

});

app.use("/",router);

app.listen(8080);

總之在檢測用戶登錄和引導(dǎo)用戶應(yīng)該訪問哪個頁面是,路由中間件絕對好用洒闸。


3.錯誤處理中間件

顧名思義染坯,它是指當(dāng)我們匹配不到路由時所執(zhí)行的操作。錯誤處理中間件和其他中間件基本一樣丘逸,只不過其需要開發(fā)者提供4個自變量參數(shù)单鹿。

app.use((err, req, res, next) => {

? ? ? ? res.sendStatus(err.httpStatusCode).json(err);

});

一般情況下,我們把錯誤處理放在最下面深纲,這樣我們即可對錯誤進行集中處理仲锄。

const express=require("express");

var app=express();

app.get("/",function(req,res,next){

? ??const err=new Error('Not Found');

? ??res.send("主頁");

? ??next(err);

});

app.use("/user",function(err,req,res,next){

? ??console.log("用戶登錄");

? ??next(err);

},function(req,res,next){

? ??res.send("用戶登錄");

? ??next();

});

app.use(function(req,res){

? ??res.status(404).send("未找到指定頁面");

});

app.listen(8080);


4.內(nèi)置中間件

從版本4.x開始劲妙,Express不再依賴Content,也就是說Express以前的內(nèi)置中間件作為單獨模塊儒喊,express.static是Express的唯一內(nèi)置中間件镣奋。

express.static(root, [options]);

通過express.static我們可以指定要加載的靜態(tài)資源。root代表加載靜態(tài)資源的路徑怀愧,options作為可選參數(shù);詳細(xì)請看官網(wǎng):express內(nèi)置中間件

以下示例將使用了 express.static 中間件侨颈,并且提供了一個詳細(xì)的’options’對象(作為示例):

var options = {

? dotfiles: 'ignore',

? etag: false,

? extensions: ['htm', 'html'],

? index: false,

? maxAge: '1d',

? redirect: false,

? setHeaders: function (res, path, stat) {

? ? res.set('x-timestamp', Date.now());

? }

}

app.use(express.static('public', options));


5.第三方中間件

形如之前我們的body-parser,采用引入外部模塊的方式來獲得更多的應(yīng)用操作芯义。如后期的cookie和session哈垢。

var express = require('express');

var app = express();

var cookieParser = require('cookie-parser');

以上就是關(guān)于express中間件類型,在實際項目中扛拨,中間件都是必不可少的耘分,因此熟悉使用各種中間件會加快項目的開發(fā)效率。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绑警,一起剝皮案震驚了整個濱河市求泰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌待秃,老刑警劉巖拜秧,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異章郁,居然都是意外死亡枉氮,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門暖庄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來聊替,“玉大人,你說我怎么就攤上這事培廓∪乔模” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵肩钠,是天一觀的道長泣港。 經(jīng)常有香客問我,道長价匠,這世上最難降的妖魔是什么当纱? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮踩窖,結(jié)果婚禮上坡氯,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好箫柳,可當(dāng)我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布手形。 她就那樣靜靜地躺著,像睡著了一般悯恍。 火紅的嫁衣襯著肌膚如雪库糠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天坪稽,我揣著相機與錄音曼玩,去河邊找鬼鳞骤。 笑死窒百,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的豫尽。 我是一名探鬼主播篙梢,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼美旧!你這毒婦竟也來了渤滞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤榴嗅,失蹤者是張志新(化名)和其女友劉穎妄呕,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗽测,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡绪励,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了唠粥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疏魏。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖晤愧,靈堂內(nèi)的尸體忽然破棺而出大莫,到底是詐尸還是另有隱情,我是刑警寧澤官份,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布只厘,位于F島的核電站,受9級特大地震影響舅巷,放射性物質(zhì)發(fā)生泄漏羔味。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一悄谐、第九天 我趴在偏房一處隱蔽的房頂上張望介评。 院中可真熱鬧,春花似錦、人聲如沸们陆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坪仇。三九已至杂腰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間椅文,已是汗流浹背喂很。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留皆刺,地道東北人少辣。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像羡蛾,于是被迫代替她去往敵國和親漓帅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,509評論 2 348

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