koa2原始碼解析

2021-09-24 06:31:24 字數 2113 閱讀 8993

koa版本2.4.1

以如下示例**進行說明

const koa = require("koa");

// 1.執行建構函式

// 2.註冊中介軟體

ctx.body = "hello world";

});// 3.啟動指定埠的http服務

複製**

1.建構函式
constructor() 

複製**

2.註冊中介軟體
use(fn)

複製**

3.啟動指定埠的http服務
listen(...args) 

複製**

this.callback執行會返回handlerequest作為http.createserver的引數

callback() ;

return handlerequest;

}複製**

callback方法是koa對中介軟體處理以及設定響應的核心邏輯

我們先來看下compose(this.middleware), compose實現了koa中介軟體呼叫邏輯

// koa-compose模組

function

compose(middleware)

index = i;

let fn = middleware[i];

// 如果所有的中介軟體都已執行完,由於koa執行compose返回的函式fnmiddleware(ctx)並沒有傳next,所以fn為undefined,直接返回promise.resolve()

if (i === middleware.length) fn = next;

if (!fn) return

promise.resolve();

try )

);} catch (err)

}}複製**

compose內部的中介軟體的呼叫邏輯見上文注釋不在複述,下面說一下為什麼koa中介軟體執行是洋蔥模型?

見如下**

// **1

await next();

// **2

});複製**

當middleware中介軟體執行時,會先執行**1,再執行await next(),await會等到next返回的promise狀態變為resolve之後再執行**2

執行順序為:**1 => 其他中介軟體(middleware2 => middleware3 => ... ) => **2

講完compose,接下來來看下this.callback裡面的handlerequest方法,呼叫方式http.createserver(handlerequest)

const handlerequest = (req, res) => ;

複製**

handlerequest內部呼叫了createcontext和handlerequest, createcontext方法會通過在context物件擴充套件一些常用物件生成ctx對像。koa通過攔截get和set操作來實現**(類似object.defineproperty)

例如:ctx攔截了body的get和set,實現了對ctx.response的**。對ctx.body的取值和賦值,實際操作的是ctx.response.body。好處就是將response的邏輯分離到了response.js中

handlerequest方法會呼叫this.handlerequest,**如下

handlerequest(ctx, fnmiddleware) 

複製**

fnmiddleware(ctx).then(handleresponse).catch(onerror)可以理解為3個步驟:

catch(error):捕獲中介軟體執行時可能發生的異常

結語本文大致講了一下koa的執行流程,更多細節見原始碼注釋

另附koa-router原始碼解析

Koa2原始碼學習

koa 基於 node.js 平台的下一代 web 開發框架 const koa require koa do some thing 以上 構建了乙個簡單的伺服器,你可以在瀏覽器輸入 localhost 8080 來訪問 下面我們通過建立koa伺服器,且傳送一次http請求來了解原始碼 在koa例項...

koa2 原始碼解讀

自從在簡歷上寫了使用過nodejs的koa框架起,我被面試官問起node和koa的次數呈指數 為了防止一問三不知的情況再次發生決心去閱讀原始碼。首先我們看下不使用koa和使用的區別 呼叫listen 函式,在listen函式中我們可以看到,開啟了乙個http服務並傳入了callback 函式 lis...

koa2原始碼解讀與總結

koa2的原始碼比較簡單,整個框架只要能夠很好的理解其中介軟體基本就能了解其執行和設計的原理。我建議讀koa的原始碼最好從使用的寫法開始梳理,一步一步深入其原理。一段最簡單的koa原始碼如下 const koa require koa ctx.body hello world 根據此段 可以看出,k...