iKcamp團(tuán)隊(duì)制作|基于Koa2搭建Node.js實(shí)戰(zhàn)(含視頻)? 中間件用法

中間件用法——講解 Koa2 中間件的用法及如何開發(fā)中間件

???? iKcamp 制作團(tuán)隊(duì)

原創(chuàng)作者:大哼阿干蒋腮、三三淘捡、小虎胖子池摧、小哈焦除、DDU可木作彤、晃晃
文案校對(duì):李益膘魄、大力萌乌逐、AuDDU创葡、小溪里浙踢、小哈
風(fēng)采主播:可木阿干灿渴、Au洛波、DDU小哈
視頻剪輯:小溪里
主站運(yùn)營:給力xi骚露、xty
教程主編:張利濤


視頻地址:https://www.cctalk.com/v/15114357763623

文章

middleware 中間件

正是因?yàn)橹虚g件的擴(kuò)展性才使得 Koa 的代碼簡單靈活蹬挤。

app.js 中,有這樣一段代碼:

app.use(async (ctx, next)=>{
  await next()
  ctx.response.type = 'text/html'
  ctx.response.body = '<h1>Hello World</h1>'  
})

它的作用是:每收到一個(gè) http 請(qǐng)求棘幸,Koa 都會(huì)調(diào)用通過 app.use() 注冊(cè)的 async 函數(shù)闻伶,同時(shí)為該函數(shù)傳入 ctxnext 兩個(gè)參數(shù)。而這個(gè) async 函數(shù)就是我們所說的中間件够话。

下面我們簡單介紹一下傳入中間件的兩個(gè)參數(shù)蓝翰。

ctx

ctx 作為上下文使用,包含了基本的 ctx.requestctx.response女嘲。另外畜份,還對(duì) Koa 內(nèi)部對(duì)一些常用的屬性或者方法做了代理操作,使得我們可以直接通過 ctx 獲取欣尼。比如爆雹,ctx.request.url 可以寫成 ctx.url

除此之外愕鼓,Koa 還約定了一個(gè)中間件的存儲(chǔ)空間 ctx.state钙态。通過 state 可以存儲(chǔ)一些數(shù)據(jù),比如用戶數(shù)據(jù)菇晃,版本信息等册倒。如果你使用 webpack 打包的話,可以使用中間件磺送,將加載資源的方法作為 ctx.state 的屬性傳入到 view 層驻子,方便獲取資源路徑。

next

next 參數(shù)的作用是將處理的控制權(quán)轉(zhuǎn)交給下一個(gè)中間件估灿,而 next() 后面的代碼崇呵,將會(huì)在下一個(gè)中間件及后面的中間件(如果有的話)執(zhí)行結(jié)束后再執(zhí)行。

注意: 中間件的順序很重要馅袁!

我們重寫 app.js 來解釋下中間件的流轉(zhuǎn)過程:

// 按照官方示例
const Koa = require('koa')
const app = new Koa()

// 記錄執(zhí)行的時(shí)間
app.use(async (ctx, next) => {
  let stime = new Date().getTime()
  await next()
  let etime = new Date().getTime()
  ctx.response.type = 'text/html'
  ctx.response.body = '<h1>Hello World</h1>'
  console.log(`請(qǐng)求地址: ${ctx.path}域慷,響應(yīng)時(shí)間:${etime - stime}ms`)
});

app.use(async (ctx, next) => {
  console.log('中間件1 doSoming')
  await next();
  console.log('中間件1 end')
})

app.use(async (ctx, next) => {
  console.log('中間件2 doSoming')
  await next();
  console.log('中間件2 end')
})

app.use(async (ctx, next) => {
  console.log('中間件3 doSoming')
  await next();
  console.log('中間件3 end')
})

app.listen(3000, () => {
  console.log('server is running at http://localhost:3000')
})

運(yùn)行起來后,控制臺(tái)顯示:

server is running at http://localhost:3000

然后打開瀏覽器,訪問 http://localhost:3000犹褒,控制臺(tái)顯示內(nèi)容更新為:

server is running at http://localhost:3000
中間件1 doSoming
中間件2 doSoming
中間件3 doSoming
中間件3 end
中間件2 end
中間件1 end
請(qǐng)求地址: /兄纺,響應(yīng)時(shí)間:2ms

從結(jié)果上可以看到,流程是一層層的打開化漆,然后一層層的閉合估脆,像是剝洋蔥一樣 —— 洋蔥模型。

此外座云,如果一個(gè)中間件沒有調(diào)用 await next()疙赠,會(huì)怎樣呢?答案是『后面的中間件將不會(huì)執(zhí)行』朦拖。

修改 app.js 如下圃阳,我們?nèi)サ袅说谌齻€(gè)中間件里面的 await

const Koa = require('koa')
const app = new Koa()

// 記錄執(zhí)行的時(shí)間
app.use(async (ctx, next)=>{
  let stime = new Date().getTime()
  await next()
  let etime = new Date().getTime()
  ctx.response.type = 'text/html'
  ctx.response.body = '<h1>Hello World</h1>'
  console.log(`請(qǐng)求地址: ${ctx.path},響應(yīng)時(shí)間:${etime - stime}ms`)
});

app.use(async (ctx, next) => {
  console.log('中間件1 doSoming')
  await next();
  console.log('中間件1 end')
})

app.use(async (ctx, next) => {
  console.log('中間件2 doSoming')
  // 注意璧帝,這里我們刪掉了 next
  // await next()
  console.log('中間件2 end')
})

app.use(async (ctx, next) => {
  console.log('中間件3 doSoming')
  await next();
  console.log('中間件3 end')
})

app.listen(3000, () => {
  console.log('server is running at http://localhost:3000')
})

重新運(yùn)行代碼后捍岳,控制臺(tái)顯示如下:

server is running at http://localhost:3000
中間件1 doSoming
中間件2 doSoming
中間件2 end
中間件1 end
請(qǐng)求地址: /,響應(yīng)時(shí)間:1ms

與我們的預(yù)期結(jié)果『后面的中間件將不會(huì)執(zhí)行』是一致的睬隶。

下一篇:我們將學(xué)習(xí)下如何響應(yīng)瀏覽器的各種請(qǐng)求锣夹。

image.png

上一篇:iKcamp新課程推出啦~~~~~iKcamp團(tuán)隊(duì)制作|基于Koa2搭建Node.js實(shí)戰(zhàn)(含視頻)? 環(huán)境準(zhǔn)備

推薦: 翻譯項(xiàng)目Master的自述:

干貨|人人都是翻譯項(xiàng)目的Master

WX20171222-110437@2x.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市苏潜,隨后出現(xiàn)的幾起案子银萍,更是在濱河造成了極大的恐慌,老刑警劉巖恤左,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贴唇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡飞袋,警方通過查閱死者的電腦和手機(jī)戳气,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巧鸭,“玉大人瓶您,你說我怎么就攤上這事√阒澹” “怎么了览闰?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長巷折。 經(jīng)常有香客問我,道長崖咨,這世上最難降的妖魔是什么锻拘? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上署拟,老公的妹妹穿的比我還像新娘婉宰。我一直安慰自己,他們只是感情好推穷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布心包。 她就那樣靜靜地躺著,像睡著了一般馒铃。 火紅的嫁衣襯著肌膚如雪蟹腾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天区宇,我揣著相機(jī)與錄音娃殖,去河邊找鬼。 笑死议谷,一個(gè)胖子當(dāng)著我的面吹牛炉爆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播卧晓,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼芬首,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了逼裆?” 一聲冷哼從身側(cè)響起衩辟,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎波附,沒想到半個(gè)月后艺晴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掸屡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年封寞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仅财。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡狈究,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盏求,到底是詐尸還是另有隱情抖锥,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布碎罚,位于F島的核電站磅废,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏荆烈。R本人自食惡果不足惜拯勉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一竟趾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宫峦,春花似錦岔帽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至妥曲,卻和暖如春贾费,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逾一。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來泰國打工铸本, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人遵堵。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓箱玷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親陌宿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子锡足,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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