摘要:洋蔥圈處理模型。基于的靈活強大的中間件機制。參考官網提供的基本,不在贅述部分實現,參考源碼分析常用服務端口監聽返回適用于方法的回調函數來處理請求。
本文 github 地址: https://github.com/HCThink/h-blog/blob/master/source/koa2/readme.md
github 首頁(star+watch,一手動態直達): https://github.com/HCThink/h-blog
掘金 link , 掘金 專欄
segmentfault 主頁
原創禁止私自轉載
koa2koa homepage
優秀的下一代 web 開發框架。基礎使用 快速搭建簡易 koa server 服務
Koa 應用程序不是 HTTP 服務器的1對1展現。 可以將一個或多個 Koa 應用程序安裝在一起以形成具有單個HTTP服務器的更大應用程序。
koa 搭建一個服務還是很簡單的, 主要代碼如下, 完整代碼如下. 切到主目錄下,
安裝依賴: yarn
執行入口: yarn start
koa demo 目錄
koa demo 主文件
import Koa from "koa"; import https from "https"; import open from "open"; const Log = console.log; const App = new Koa(); App.use(async (ctx, next) => { ctx.body = "Hello World"; Log("mid1 start..."); await next(); Log("mid1 end..."); }); App.use(async (ctx, next) => { debugger; Log("mid2 start..."); await next(); Log("mid2 end..."); }); App.use((ctx, next) => { Log("mid3..."); }); // 服務監聽: 兩種方式。 App.listen(3000); // 語法糖 // http.createServer(app.callback()).listen(3000); https.createServer(App.callback()).listen(3001); open("http://localhost:3000"); // 如下為執行順序, 實際上 http 會握手,所以輸出多次 // 如下執行特征也就是洋蔥圈, 實際上熟悉 async、await 則不會比較意外。 // mid1 start... // mid2 start... // mid3... // mid2 end... // mid1 end...koa2特性
封裝并增強 node http server[request, response],簡單易容。
洋蔥圈處理模型。
基于 async/await 的靈活強大的中間件機制。
通過委托使得 api 在使用上更加便捷易用。
api參考官網提供的基本 api ,不在贅述: https://koa.bootcss.com/
部分 api 實現,參考: 源碼分析
常用 apiapp.listen: 服務端口監聽
app.callback: 返回適用于 http.createServer() 方法的回調函數來處理請求。你也可以使用此回調函數將 koa 應用程序掛載到 Connect/Express 應用程序中。
app.use(function): 掛載中間件的主要方法。
核心對象context
Koa Context 將 node 的 request 和 response 對象封裝到單個對象中,為編寫 Web 應用程序和 API 提供了許多有用的方法。 這些操作在 HTTP 服務器開發中頻繁使用,它們被添加到此級別而不是更高級別的框架,這將強制中間件重新實現此通用功能。__每個__ 請求都將創建一個 Context,并在中間件中作為接收器引用,或者 ctx 標識符。
ctx.res request
ctx.req: response
ctx.request: koa request tool
ctx.response: koa response tool
ctx.cookies
ctx.request.accepts(types): type 值可能是一個或多個 mime 類型的字符串,如 application/json,擴展名稱如 json,或數組 ["json", "html", "text/plain"]。
request.acceptsCharsets(charsets)
...
更多參考
洋蔥圈 使用層面koa 洋蔥圈執行機制圖解
koa 洋蔥圈
koa demo, koa demo 源碼
洋蔥圈簡易實現版
執行方式: tsc onionRings.ts --lib "es2015" --sourceMap && node onionRings.js
洋蔥圈簡易實現版 main, 洋蔥圈簡易實現版 源碼
簡易實現 外部中間件
參考: koa-bodyparser
main code
public use(middleware: Function) { this.middList.push(middleware); } // 執行器 private async deal(i: number = 0) { debugger; if (i >= this.middList.length) { return false; } await this.middList[i](this, this.deal.bind(this, i + 1)); }實現思路
use 方法注冊 middleware。
deal 模擬一個執行器: 大致思路就是將下一個 middleware 作為上一個 middleware 的 next 去 await,用以保證正確的執行順序和中斷。
問題如果習慣了回調的思路, 你會不會有這種疑惑: 洋蔥圈機制于在 一個中間件中調用另一個中間件,被調中間件執行成功,回到當前中間件繼續往后執行,這樣不斷調用,中間件很多的話, 會不會形成一個很深的函數調用棧? 從而影響性能, 同時形成「xx 地獄」? -- ps(此問題源于分享時原同事 小龍 的提問。)
實際上這是個很好的問題,對函數執行機制比較了解才會產生的疑問。排除異步代碼處理,我們很容易用同步方式模擬出這種調用層級。參考: 同步方式。 這種模式存在明顯的調用棧問題。
我可以負責任的回答: 不會的,下一個問題。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/100014.html
摘要:實現的四大模塊上文簡述了源碼的大體框架結構,接下來我們來實現一個的框架,筆者認為理解和實現一個框架需要實現四個大模塊,分別是封裝創建類構造函數構造對象中間件機制和剝洋蔥模型的實現錯誤捕獲和錯誤處理下面我們就逐一分析和實現。 什么是koa框架? ? ? ? ?koa是一個基于node實現的一個新的web框架,它是由express框架的原班人馬打造的。它的特點是優雅、簡潔、表達力強、自由度...
摘要:實現的四大模塊上文簡述了源碼的大體框架結構,接下來我們來實現一個的框架,筆者認為理解和實現一個框架需要實現四個大模塊,分別是封裝創建類構造函數構造對象中間件機制和剝洋蔥模型的實現錯誤捕獲和錯誤處理下面我們就逐一分析和實現。 什么是koa框架? ? ? ? ?koa是一個基于node實現的一個新的web框架,它是由express框架的原班人馬打造的。它的特點是優雅、簡潔、表達力強、自由度...
摘要:接上次挖的坑,對相關的源碼進行分析第一篇。和同為一批人進行開發,與相比,顯得非常的迷你。在接收到一個請求后,會拿之前提到的與來創建本次請求所使用的上下文。以及如果沒有手動指定,會默認指定為。 接上次挖的坑,對koa2.x相關的源碼進行分析 第一篇。 不得不說,koa是一個很輕量、很優雅的http框架,尤其是在2.x以后移除了co的引入,使其代碼變得更為清晰。 express和ko...
摘要:是一個非常輕量的框架,里面除了和之外什么都沒有,甚至連最基本的功能都需要通過安裝其他中間件來實現。而的源碼同樣很簡潔,基礎代碼只有不到行,非常適合閱讀學習。的源碼直接從獲取,本文采用目前最新的版本。 koa是一個非常輕量的web框架,里面除了ctx和middleware之外什么都沒有,甚至連最基本的router功能都需要通過安裝其他中間件來實現。不過雖然簡單,但是它卻非常強大,僅僅依靠...
閱讀 2155·2021-10-08 10:15
閱讀 1185·2019-08-30 15:52
閱讀 514·2019-08-30 12:54
閱讀 1531·2019-08-29 15:10
閱讀 2682·2019-08-29 12:44
閱讀 3008·2019-08-29 12:28
閱讀 3348·2019-08-27 10:57
閱讀 2212·2019-08-26 12:24