中介軟體概念
koa是乙個精簡的node框架,它主要做了以下事情:
基於node原生req和res為request和response物件賦能,並基於它們封裝成乙個context物件。
基於async/await(generator)的中介軟體洋蔥模型機制。
koa1和koa2在原始碼上的區別主要是於對非同步中介軟體的支援方式的不同。
koa1是使用generator、yield)的模式。
koa2使用的是async/await+promise的模式。
── lib
koa(
)├── context.js ctx
├── request.js ctx.req || ctx.request
└── response.js ctx.res || ctx.response
每個中介軟體都是乙個函式(不是函式將報錯),接收兩個引數,ctx上下文物件,next函式(由koa-compose定義)const compose =
require
('koa-compose');
// 該陣列存放所有通過use函式的引入的中介軟體函式
middleware =
;use
(fn)
/** * thia.misslwwre已經唄use方法將中介軟體push到middleware陣列
* 在函式式程式設計中,compose是將多個函式合併成乙個函式(組合函式)(形如: g() + h() => g(h())),
* koa-compose則是將 koa/koa-router 各個中介軟體合併執行,結合 next() 就形成了洋蔥式模型, 相關原始碼如下。
*/callback()
中介軟體分為:應用級中介軟體、路由級中介軟體、錯誤處理中介軟體、第三方中介軟體
初始化koa例項後,use方法載入中介軟體(middleware),會有乙個middleware中介軟體陣列來儲存中介軟體,use呼叫順序會決定中介軟體的執行順序。
在建立好http伺服器後,呼叫koa-compose模組對middleware中介軟體陣列進行處理。
原理就是:
會從middleware陣列中取第乙個函式開始執行,中介軟體函式中呼叫next方法就會去取下乙個中介軟體函式繼續執行。每個中介軟體函式執行完畢後都會返回乙個promise物件。(ps:呼叫next方法並不是表示當前中介軟體函式執行完畢了,呼叫next之後仍可以繼續執行其他**)
中介軟體函式佇列,會在最後乙個中介軟體或乙個沒有呼叫next的中介軟體那裡停止。
koa官方文件上把外層的中介軟體稱為"上游",內層的中介軟體為"下游"。
一般的中介軟體都會執行兩次,呼叫next之前為第一次,呼叫next時把控制傳遞給下游的下乙個中介軟體。當下游不再有中介軟體或者沒有執行next函式時,就將依次恢復上游中介軟體的行為,讓上游中介軟體執行next之後的**–洋蔥模型
示例一:
**僅是用於,在命令列觀察中介軟體執行順序。執行結果自然是1 -> 2 -> 3。
兩個函式看做是兩個中介軟體,第乙個函式呼叫next時就會執行第二個中介軟體函式。
示例二:
如果第二個函式中存在非同步,比如settimeout(() => , 2000),那結果就變成1 -> 3 -> 2了。
示例三:
如果要保證第二個中介軟體函式執行完畢後,才執行第乙個中介軟體函式next之後的**的話,就需要使用async/await了要保證中介軟體2裡非同步**執行完畢後,才去執行中介軟體next函式之後的**。
具體做法:
第乙個中介軟體使用async/await,第二個中介軟體返回乙個promise物件,執行完畢非同步**後再resolve,呼叫next()得到的就是第二個中介軟體返回的資料。
這樣就保證了**的執行順序(洋蔥模型)
Koa中介軟體機制的洋蔥圈模型
const koa require koa console.log 1 await next console.log 6 console.log 2 await next console.log 5 console.log 3 ctx.body hello world console.log 4 c...
2 Koa中介軟體與洋蔥模型
1.async await 為了更好的理解aysnc await,我們先請求兩個介面 1.請求github中的使用者介面 請求github使用者介面 fetch then res res.json then json console.log json 2.請求github中的使用者介面後,請求特定使...
js 中介軟體的洋蔥模型
var express require express console.log a middleware1 開始 next console.log b middleware1 結束 console.log c middleware2 開始 next console.log d middleware2...