中間件用法——講解 Koa2 中間件的用法及如何開發(fā)中間件 ?? iKcamp 制作團隊
原創(chuàng)作者:大哼、阿干、三三、小虎、胖子、小哈、DDU、可木、晃晃
文案校對:李益、大力萌、Au、DDU、小溪里、小哈
風(fēng)采主播:可木、阿干、Au、DDU、小哈
視頻剪輯:小溪里
主站運營:給力xi、xty
教程主編:張利濤
視頻地址:https://www.cctalk.com/v/15114357763623
文章 middleware 中間件正是因為中間件的擴展性才使得 Koa 的代碼簡單靈活。
在 app.js 中,有這樣一段代碼:
app.use(async (ctx, next)=>{ await next() ctx.response.type = "text/html" ctx.response.body = "Hello World
" })
它的作用是:每收到一個 http 請求,Koa 都會調(diào)用通過 app.use() 注冊的 async 函數(shù),同時為該函數(shù)傳入 ctx 和 next 兩個參數(shù)。而這個 async 函數(shù)就是我們所說的中間件。
下面我們簡單介紹一下傳入中間件的兩個參數(shù)。
ctxctx 作為上下文使用,包含了基本的 ctx.request 和 ctx.response。另外,還對 Koa 內(nèi)部對一些常用的屬性或者方法做了代理操作,使得我們可以直接通過 ctx 獲取。比如,ctx.request.url 可以寫成 ctx.url。
除此之外,Koa 還約定了一個中間件的存儲空間 ctx.state。通過 state 可以存儲一些數(shù)據(jù),比如用戶數(shù)據(jù),版本信息等。如果你使用 webpack 打包的話,可以使用中間件,將加載資源的方法作為 ctx.state 的屬性傳入到 view 層,方便獲取資源路徑。
nextnext 參數(shù)的作用是將處理的控制權(quán)轉(zhuǎn)交給下一個中間件,而 next() 后面的代碼,將會在下一個中間件及后面的中間件(如果有的話)執(zhí)行結(jié)束后再執(zhí)行。
注意: 中間件的順序很重要!
我們重寫 app.js 來解釋下中間件的流轉(zhuǎn)過程:
// 按照官方示例 const Koa = require("koa") const app = new Koa() // 記錄執(zhí)行的時間 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(`請求地址: ${ctx.path},響應(yīng)時間:${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") })
運行起來后,控制臺顯示:
server is running at http://localhost:3000
然后打開瀏覽器,訪問 http://localhost:3000,控制臺顯示內(nèi)容更新為:
server is running at http://localhost:3000 中間件1 doSoming 中間件2 doSoming 中間件3 doSoming 中間件3 end 中間件2 end 中間件1 end 請求地址: /,響應(yīng)時間:2ms
從結(jié)果上可以看到,流程是一層層的打開,然后一層層的閉合,像是剝洋蔥一樣 —— 洋蔥模型。
此外,如果一個中間件沒有調(diào)用 await next(),會怎樣呢?答案是『后面的中間件將不會執(zhí)行』。
修改 app.js 如下,我們?nèi)サ袅说谌齻€中間件里面的 await:
const Koa = require("koa") const app = new Koa() // 記錄執(zhí)行的時間 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(`請求地址: ${ctx.path},響應(yīng)時間:${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") })
重新運行代碼后,控制臺顯示如下:
server is running at http://localhost:3000 中間件1 doSoming 中間件2 doSoming 中間件2 end 中間件1 end 請求地址: /,響應(yīng)時間:1ms
與我們的預(yù)期結(jié)果『后面的中間件將不會執(zhí)行』是一致的。
下一篇:我們將學(xué)習(xí)下如何響應(yīng)瀏覽器的各種請求。
上一篇:iKcamp新課程推出啦~~~~~iKcamp團隊制作|基于Koa2搭建Node.js實戰(zhàn)(含視頻)? 環(huán)境準(zhǔn)備推薦: 翻譯項目Master的自述: 干貨|人人都是翻譯項目的Master
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/92309.html
安裝搭建項目的開發(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 等新語法,所以請保證 node 環(huán)境在 7.6...
摘要:玩轉(zhuǎn)同時全面掌握潮流技術(shù)采用新一代的開發(fā)框架更小更富有表現(xiàn)力更健壯。融合多種常見的需求場景網(wǎng)絡(luò)請求解析模板引擎靜態(tài)資源日志記錄錯誤請求處理。結(jié)合語句中轉(zhuǎn)中間件控制權(quán),解決回調(diào)地獄問題。注意分支中的目錄為當(dāng)節(jié)課程后的完整代碼。 ?? ?與眾不同的學(xué)習(xí)方式,為你打開新的編程視角 獨特的『同步學(xué)習(xí)』方式 文案講解+視頻演示,文字可激發(fā)深層的思考、視頻可還原實戰(zhàn)操作過程。 云集一線大廠...
摘要:云集一線大廠有真正實力的程序員團隊云集一線大廠經(jīng)驗豐厚的碼農(nóng),開源奉獻各教程。融合多種常見的需求場景網(wǎng)絡(luò)請求解析模板引擎靜態(tài)資源日志記錄錯誤請求處理。結(jié)合語句中轉(zhuǎn)中間件控制權(quán),解決回調(diào)地獄問題。注意分支中的目錄為當(dāng)節(jié)課程后的完整代碼。 ?? ?與眾不同的學(xué)習(xí)方式,為你打開新的編程視角 獨特的『同步學(xué)習(xí)』方式 文案講解+視頻演示,文字可激發(fā)深層的思考、視頻可還原實戰(zhàn)操作過程。 云...
路由koa-router——MVC 中重要的環(huán)節(jié):Url 處理器 ?? iKcamp 制作團隊 原創(chuàng)作者:大哼、阿干、三三、小虎、胖子、小哈、DDU、可木、晃晃 文案校對:李益、大力萌、Au、DDU、小溪里、小哈 風(fēng)采主播:可木、阿干、Au、DDU、小哈 視頻剪輯:小溪里 主站運營:給力xi、xty 教程主編:張利濤 視頻地址:https://www.cctalk.com/v/151...
POST/GET請求——常見請求方式處理 ?? iKcamp 制作團隊 原創(chuàng)作者:大哼、阿干、三三、小虎、胖子、小哈、DDU、可木、晃晃 文案校對:李益、大力萌、Au、DDU、小溪里、小哈 風(fēng)采主播:可木、阿干、Au、DDU、小哈 視頻剪輯:小溪里 主站運營:給力xi、xty 教程主編:張利濤 視頻地址:https://www.cctalk.com/v/15114357765870 ...
閱讀 3230·2023-04-26 02:27
閱讀 2145·2021-11-22 14:44
閱讀 4107·2021-10-22 09:54
閱讀 3203·2021-10-14 09:43
閱讀 759·2021-09-23 11:53
閱讀 12747·2021-09-22 15:33
閱讀 2715·2019-08-30 15:54
閱讀 2691·2019-08-30 14:04