koa中介軟體梳理(洋蔥模型)

2021-10-03 07:15:03 字數 2201 閱讀 2526

中介軟體概念

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

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()

每個中介軟體都是乙個函式(不是函式將報錯),接收兩個引數,ctx上下文物件,next函式(由koa-compose定義)

中介軟體分為:應用級中介軟體、路由級中介軟體、錯誤處理中介軟體、第三方中介軟體

初始化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...