1. 程式人生 > 程式設計 >全棧專案|小書架|伺服器開發-Koa2中介軟體機制洋蔥模型瞭解一下

全棧專案|小書架|伺服器開發-Koa2中介軟體機制洋蔥模型瞭解一下

KOA2

是什麼?

Koa是一個新的 web 框架,由 Express 幕後的原班人馬打造, 致力於成為 web 應用和 API 開發領域中的一個更小、更富有表現力、更健壯的基石。 通過利用 async函式,Koa幫你丟棄回撥函式,並有力地增強錯誤處理。 Koa 並沒有捆綁任何中介軟體, 而是提供了一套優雅的方法,幫助您快速而愉快地編寫服務端應用程式。

為什麼產生?

筆者對這幾個框架都不熟,這裡就不誤人子弟了。可以看看下面一些大佬的介紹。

Koa是由Express的原班人馬打造,那麼他們為什麼不將Express升級版本呢而是從新開發新的一個專案?看官方的介紹:Koa 與 Express

中介軟體

中介軟體(英語:Middleware),又譯中介軟體、中介層,是提供系統軟體和應用軟體之間連線的軟體,以便於軟體各部件之間的溝通,特別是應用軟體對於系統軟體的集中的邏輯,在現代資訊科技應用框架如Web服務、面向服務的體系結構等中應用比較廣泛。中介軟體-維基百科

中介軟體只是一種服務,沒有這種服務系統也能夠存在。比如:一臺桌上型電腦,是由很多個部件組裝而成。滑鼠、鍵盤等只是為了讓系統更加完善。即使沒有滑鼠或者鍵盤,桌上型電腦也可以使用其他硬體軟體來操作電腦。或者檢視 AOP 面向切面程式設計 中的比喻。

非常有用的Koa中介軟體合集

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來源

洋蔥模型圖示1
就是從請求到響應的過程所有的中介軟體都會走兩遍。看不太清楚的可以看圖示2。 洋蔥圈模型圖示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

複製程式碼

通過結果可以看出執行過程和洋蔥模型是一致的。

參考


諮詢請加微信:輕撩即可。

在這裡插入圖片描述