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