1. 程式人生 > >【轉載】koa相關知識(來自官網)

【轉載】koa相關知識(來自官網)

然而 koa res web 信號 connect 支持 ng- pro

什麽是Koa?

koa 是由 Express 原班人馬打造的,致力於成為一個更小、更富有表現力、更健壯的 Web 框架。使用 koa 編寫 web 應用,通過組合不同的 generator,可以免除重復繁瑣的回調函數嵌套,並極大地提升錯誤處理的效率。koa 不在內核方法中綁定任何中間件,它僅僅提供了一個輕量優雅的函數庫,使得編寫 Web 應用變得得心應手。

Koa的應用?

Koa 應用是一個包含一系列中間件 generator 函數的對象。 這些中間件函數基於 request 請求以一個類似於棧的結構組成並依次執行。 Koa 類似於其他中間件系統(比如 Ruby‘s Rack 、Connect 等), 然而 Koa 的核心設計思路是為中間件層提供高級語法糖封裝,以增強其互用性和健壯性,並使得編寫中間件變得相當有趣。

Koa 包含了像 content-negotiation(內容協商)、cache freshness(緩存刷新)、proxy support(代理支持)和 redirection(重定向)等常用任務方法。 與提供龐大的函數支持不同,Koa只包含很小的一部分,因為Koa並不綁定任何中間件

中間鍵級聯?

Koa 的中間件通過一種更加傳統(您也許會很熟悉)的方式進行級聯,摒棄了以往 node 頻繁的回調函數造成的復雜代碼邏輯。 我們通過 generators 來實現“真正”的中間件。 Connect 簡單地將控制權交給一系列函數來處理,直到函數返回。 與之不同,當執行到 yield next 語句時,Koa 暫停了該中間件,繼續執行下一個符合請求的中間件(‘downstrem‘),然後控制權再逐級返回給上層中間件(‘upstream‘)。

var koa = require(‘koa‘);
var app = koa();

// x-response-time

app.use(function *(next){
  var start = new Date;
  yield next;
  var ms = new Date - start;
  this.set(‘X-Response-Time‘, ms + ‘ms‘);
});

// logger

app.use(function *(next){
  var start = new Date;
  yield next;
  var ms = new Date - start;
  console.log(‘%s %s - %s‘, this.method, this.url, ms);
});

// response

app.use(function *(){
  this.body = ‘Hello World‘;
});

app.listen(3000);

當請求開始時,請求先經過 x-response-timelogging 中間件,並記錄中間件執行起始時間。 然後將控制權交給 reponse 中間件。當中間件運行到 yield next 時,函數掛起並將控制前交給下一個中間件。當沒有中間件執行 yield next 時,程序棧會逆序喚起被掛起的中間件來執行接下來的代碼。

(當一個請求過來的時候,會依次經過各個中間件進行處理,中間件跳轉的信號是yield next,當到某個中間件後,該中間件處理完不執行yield next的時候,然後就會逆序執行前面那些中間件剩下的邏輯。)

上面的執行順序就是:請求 ==> response-time中間件 ==> logger中間件 ==> 響應中間件 ==> logger中間件 ==> response-time中間件 ==> 響應。

更詳細描述就是:請求進來,先進到response-time中間件,執行 var start = new Date; 然後遇到yield next,則暫停response-time中間件的執行,跳轉進logger中間件,同理,最後進入響應中間件,響應中間件中沒有yield next代碼,則開始逆序執行,也就是再先是回到logger中間件,執行yield next之後的代碼,執行完後再回到response-time中間件執行yield next之後的代碼。

【轉載】koa相關知識(來自官網)