中間件用法——講解 Koa2 中間件的用法及如何開發(fā)中間件 ?? iKcamp 制作團(tuán)隊(duì)
原創(chuàng)作者:大哼、阿干、三三、小虎、胖子、小哈、DDU、可木、晃晃
文案校對(duì):李益、大力萌、Au、DDU、小溪里、小哈
風(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 = "Hello World
" })
它的作用是:每收到一個(gè) http 請(qǐng)求,Koa 都會(huì)調(diào)用通過 app.use() 注冊(cè)的 async 函數(shù),同時(shí)為該函數(shù)傳入 ctx 和 next 兩個(gè)參數(shù)。而這個(gè) async 函數(shù)就是我們所說的中間件。
下面我們簡單介紹一下傳入中間件的兩個(gè)參數(shù)。
ctxctx 作為上下文使用,包含了基本的 ctx.request 和 ctx.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 層,方便獲取資源路徑。
nextnext 參數(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 = "Hello World
" 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 = "Hello World
" 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)求。
上一篇:iKcamp新課程推出啦~~~~~iKcamp團(tuán)隊(duì)制作|基于Koa2搭建Node.js實(shí)戰(zhàn)(含視頻)? 環(huán)境準(zhǔn)備推薦: 翻譯項(xiàng)目Master的自述: 干貨|人人都是翻譯項(xiàng)目的Master
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/92309.html
安裝搭建項(xiàng)目的開發(fā)環(huán)境 視頻地址:https://www.cctalk.com/v/15114357764004 showImg(https://segmentfault.com/img/remote/1460000012470016?w=1214&h=718); 文章 Koa 起手 - 環(huán)境準(zhǔn)備 由于 koa2 已經(jīng)開始使用 async/await 等新語法,所以請(qǐng)保證 node 環(huán)境在 7.6...
摘要:玩轉(zhuǎn)同時(shí)全面掌握潮流技術(shù)采用新一代的開發(fā)框架更小更富有表現(xiàn)力更健壯。融合多種常見的需求場(chǎng)景網(wǎng)絡(luò)請(qǐng)求解析模板引擎靜態(tài)資源日志記錄錯(cuò)誤請(qǐng)求處理。結(jié)合語句中轉(zhuǎn)中間件控制權(quán),解決回調(diào)地獄問題。注意分支中的目錄為當(dāng)節(jié)課程后的完整代碼。 ?? ?與眾不同的學(xué)習(xí)方式,為你打開新的編程視角 獨(dú)特的『同步學(xué)習(xí)』方式 文案講解+視頻演示,文字可激發(fā)深層的思考、視頻可還原實(shí)戰(zhàn)操作過程。 云集一線大廠...
摘要:云集一線大廠有真正實(shí)力的程序員團(tuán)隊(duì)云集一線大廠經(jīng)驗(yàn)豐厚的碼農(nóng),開源奉獻(xiàn)各教程。融合多種常見的需求場(chǎng)景網(wǎng)絡(luò)請(qǐng)求解析模板引擎靜態(tài)資源日志記錄錯(cuò)誤請(qǐng)求處理。結(jié)合語句中轉(zhuǎn)中間件控制權(quán),解決回調(diào)地獄問題。注意分支中的目錄為當(dāng)節(jié)課程后的完整代碼。 ?? ?與眾不同的學(xué)習(xí)方式,為你打開新的編程視角 獨(dú)特的『同步學(xué)習(xí)』方式 文案講解+視頻演示,文字可激發(fā)深層的思考、視頻可還原實(shí)戰(zhàn)操作過程。 云...
路由koa-router——MVC 中重要的環(huán)節(jié):Url 處理器 ?? iKcamp 制作團(tuán)隊(duì) 原創(chuàng)作者:大哼、阿干、三三、小虎、胖子、小哈、DDU、可木、晃晃 文案校對(duì):李益、大力萌、Au、DDU、小溪里、小哈 風(fēng)采主播:可木、阿干、Au、DDU、小哈 視頻剪輯:小溪里 主站運(yùn)營:給力xi、xty 教程主編:張利濤 視頻地址:https://www.cctalk.com/v/151...
POST/GET請(qǐng)求——常見請(qǐng)求方式處理 ?? iKcamp 制作團(tuán)隊(duì) 原創(chuàng)作者:大哼、阿干、三三、小虎、胖子、小哈、DDU、可木、晃晃 文案校對(duì):李益、大力萌、Au、DDU、小溪里、小哈 風(fēng)采主播:可木、阿干、Au、DDU、小哈 視頻剪輯:小溪里 主站運(yùn)營:給力xi、xty 教程主編:張利濤 視頻地址:https://www.cctalk.com/v/15114357765870 ...
閱讀 3222·2023-04-26 02:27
閱讀 2145·2021-11-22 14:44
閱讀 4096·2021-10-22 09:54
閱讀 3201·2021-10-14 09:43
閱讀 756·2021-09-23 11:53
閱讀 12728·2021-09-22 15:33
閱讀 2714·2019-08-30 15:54
閱讀 2687·2019-08-30 14:04