亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

koa2 一網(wǎng)打盡(基本使用,洋蔥圈,中間件機(jī)制和模擬,源碼分析(工程,核心模塊,特殊處理),核心點(diǎn)

william / 1967人閱讀

摘要:洋蔥圈處理模型。基于的靈活強(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)載

koa2

koa homepage

優(yōu)秀的下一代 web 開發(fā)框架。
Koa 應(yīng)用程序不是 HTTP 服務(wù)器的1對1展現(xiàn)。 可以將一個或多個 Koa 應(yīng)用程序安裝在一起以形成具有單個HTTP服務(wù)器的更大應(yīng)用程序。
基礎(chǔ)使用 快速搭建簡易 koa server 服務(wù)

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),參考: 源碼分析

常用 api

app.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

相關(guān)文章

  • KOA2框架原理解析實(shí)現(xiàn)

    摘要:實(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)、自由度...

    tracymac7 評論0 收藏0
  • KOA2框架原理解析實(shí)現(xiàn)

    摘要:實(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)、自由度...

    liangzai_cool 評論0 收藏0
  • koa源碼閱讀[1]-koa與koa-compose

    摘要:接上次挖的坑,對相關(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...

    vibiu 評論0 收藏0
  • 超輕量級web框架koa源碼閱讀

    摘要:是一個非常輕量的框架,里面除了和之外什么都沒有,甚至連最基本的功能都需要通過安裝其他中間件來實(shí)現(xiàn)。而的源碼同樣很簡潔,基礎(chǔ)代碼只有不到行,非常適合閱讀學(xué)習(xí)。的源碼直接從獲取,本文采用目前最新的版本。 koa是一個非常輕量的web框架,里面除了ctx和middleware之外什么都沒有,甚至連最基本的router功能都需要通過安裝其他中間件來實(shí)現(xiàn)。不過雖然簡單,但是它卻非常強(qiáng)大,僅僅依靠...

    inapt 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<