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