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