全棧專案|小書架|伺服器開發-Koa2中介軟體機制洋蔥模型瞭解一下
KOA2
是什麼?
Koa是一個新的
web
框架,由 Express 幕後的原班人馬打造, 致力於成為web
應用和API
開發領域中的一個更小、更富有表現力、更健壯的基石。 通過利用async
函式,Koa
幫你丟棄回撥函式,並有力地增強錯誤處理。Koa
並沒有捆綁任何中介軟體
, 而是提供了一套優雅的方法,幫助您快速而愉快地編寫服務端應用程式。
為什麼產生?
筆者對這幾個框架都不熟,這裡就不誤人子弟了。可以看看下面一些大佬的介紹。
Koa
是由Express
的原班人馬打造,那麼他們為什麼不將Express
升級版本呢而是從新開發新的一個專案?看官方的介紹:Koa 與 Express
中介軟體
中介軟體(英語:
Middleware
),又譯中介軟體、中介層,是提供系統軟體和應用軟體之間連線的軟體,以便於軟體各部件之間的溝通,特別是應用軟體對於系統軟體的集中的邏輯,在現代資訊科技應用框架如Web
服務、面向服務的體系結構等中應用比較廣泛。中介軟體-維基百科
中介軟體只是一種服務,沒有這種服務系統也能夠存在。比如:一臺桌上型電腦,是由很多個部件組裝而成。滑鼠、鍵盤等只是為了讓系統更加完善。即使沒有滑鼠或者鍵盤,桌上型電腦也可以使用其他硬體軟體來操作電腦。或者檢視 AOP 面向切面程式設計 中的比喻。
Koa
是一箇中介軟體框架,可以採用兩種不同的方法來實現中介軟體:
async function
common function
以下是使用兩種不同方法實現一個日誌中介軟體的示例:
中介軟體通常帶有兩個引數
(ctx,next),ctx
是一個請求的上下文(context)
,next
是呼叫執行下游中介軟體的函式. 在程式碼執行完成後通過then
方法返回一個Promise
。關於Promise
介紹可以檢視這篇文章: Promise原理講解 && 實現一個Promise物件 (遵循Promise/A+規範)
async functions (node v7.6+)
app.use(async (ctx,next) => {
const start = Date.now();
await next();
const ms = Date.now() - start;
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
});
複製程式碼
Common function
app.use((ctx,next) => {
const start = Date.now();
return next().then(() => {
const ms = Date.now() - start;
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
});
});
複製程式碼
Koa
的中介軟體機制使用的是洋蔥模型
,而什麼是洋蔥模型呢?
洋蔥模型
通過
next()
把多箇中介軟體串聯執行的效果。所有的中介軟體都會執行兩邊,就像洋蔥一樣,從洋蔥的一側進入就會從另一側出去。
洋蔥圈模型圖示1來源
就是從請求到響應的過程所有的中介軟體都會走兩遍。看不太清楚的可以看圖示2。 洋蔥圈模型圖示2 來源 通過圖示可能還不是很清楚Koa
洋蔥模型的執行過程,下面來看一個簡單例子:
const Koa = require('koa');
const app = new Koa();
// 中介軟體1
app.use(async (ctx,next)=>{
console.log(1)
next()
console.log(11)
});
// 中介軟體2
app.use(async (ctx,next) => {
console.log(2)
next()
console.log(22)
})
// 中介軟體3
app.use(async (ctx,next) => {
console.log(3)
next()
console.log(33)
})
app.listen('3000');
console.log(`http://localhost:3000`);
複製程式碼
在瀏覽器輸入http://localhost:3000
回車之後的輸出結果:
http://localhost:3000
1
2
3
33
22
11
複製程式碼
通過結果可以看出執行過程和洋蔥模型是一致的。
參考
諮詢請加微信:輕撩即可。