記一次koa2原始碼的探索經歷

2021-08-16 09:04:58 字數 2262 閱讀 6915

1.本文解決兩個問題,koa啟動的時候需要初始化哪些東西和做了哪些事情?

2.一次完整的http請求,對於koa來說是怎麼處理的?

3.我們先來回顧一下,我們在使用koa時所使用的一些**

const koa = require('koa');//載入koa框架

//載入路由

//監聽埠號,進行呼叫

logger.info('webserver 服務開啟');

});

//定義的乙個fn方法const fn = async (ctx)=>4.我們再來看下,koa2的原始碼結構

constructor()
use(fn) 

debug('use %s', fn._name || fn.name || '-');

this.middleware.push(fn);

return this;

}

你會發現use方法就幹了一件事情,將我們傳入的方法放到了middleware陣列裡,僅此而已。

3.接下來我們再來看listen方法

listen(...args)
你會發現它呼叫了http模組的createserver方法,然後監聽。和以前原生建立的web服務的方法一模一樣。那麼我們再來關心下callback裡面的內容。

callback() ;

return handlerequest;

}

這個時候,你驚奇的發現中介軟體又出現了,然後在handlerequest裡被呼叫。那麼再重點看一下koa-compose.js裡面的這個compose方法。

'use strict'

/** * expose compositor.

*/module.exports = compose

/** * compose `middleware` returning

* a fully valid middleware comprised

* of all those which are passed.

* * @param middleware

* @return

* @api public

*/function compose (middleware)

/*** @param context

* @return

* @api public

*/return function (context, next) ))

} catch (err) }}}

這段**的主要是用來合併中介軟體的,具體的意義是,我在呼叫a方法的時候,在a的中間我又想呼叫b方法了。這段**就是用來解決這個問題的。

舉個例子:

const one = (ctx, next) => 

const two = (ctx, next) =>

const three = (ctx, next) =>

執行結果如下:
>> one

>> two

>> three

<< three

<< two

<< one

這是乙個洋蔥圈模型,層層呼叫,直到最後乙個函式沒有next函式呼叫為止,然後逐層返回結果。實際上那個next函式,就是原始碼在遞迴呼叫的

function next () )
如果你還不懂,那麼把compose方法複製過去,直接執行跟**即可。如果你不想再往下呼叫了,那麼在你的函式體裡面就不用呼叫next方法即可。

總結:實際上說了這麼多其實最核心的還是koa2中介軟體原理的實現,如果有對http/https不熟悉的建議看下nodejs文件和基礎知識,對於其它原始碼還是比較容易懂的。

掌握了中介軟體,我們可以編寫一些過濾器,如報錯的中介軟體放在最外層對我們的方法進行報錯處理。

記一次原始碼分析

首先分析一段很短的 include include using namespace std vector getdata return std move v returnv intmain 這段 是錯的,裡面出現了乙個很容易犯得bug 如果函式中有建立本地物件並需要返回時,只能返回物件,不能返回指標...

記一次makefile的經歷

哎呀,剛接觸makefile 和 linux 不久,搞得很多c 的東西都拋諸腦後了,真的慚愧喲。這是我的檔案目錄 實際開發最好不要這樣命名檔案,否則到之後自己都不知道這些檔案都是幹嘛的 一開始的源 1 標頭檔案 include using std cout using std endl extern...

記一次購買小公尺的經歷

元旦要到了,打算給媽媽換一部智慧型手機,她還從沒用過呢,雖然工資不多,買一部紅公尺覺得還是比較合適的,結果發現一件細節性的小事,有些感慨。現在購買小公尺的途徑很多,不一一介紹,但是從小公尺官方購買應該只有兩種 小公尺官網和小公尺天貓 這兩者區別應該只有物流呢,按照官方的說法,小公尺官網購買的話,會在...