1. 什麼是Koa? Koa是一個Node.js Web Framework
很多人都了解Java,Java裡的Maven的是一個依賴的中心倉庫,裡面會有非常多的依賴;那麼如果大家了解Node.js的話,會發現與Maven對标的叫npm,npm也是Node.js開發者常用的倉庫。那麼Koa就是npm裡面一個非常常用的架構,一個依賴庫。
如果大家浏覽過Koa的官網,就會發現Koa主要是基于可擴充模型http協定的一個Web架構。Koa的擴充方式是基于最經典的洋蔥模型,它的洋蔥模型就是它最核心的部分,即Koa中間件。
2. Koa的基礎使用
當我們用http做一些請求的時候,總會帶着各種各樣的path,在程式員的話術裡叫router。我們通過不同的router進去,就能幫我路由到不同的方法上面去。我們現在推薦直接使用Koa,因為它已經給我們提供好了router。
在Koa官網上的github裡可以找到很多Koa中間件和依賴庫。
通過npm install,在本地建一個倉庫,這個倉庫直接通過Node.js的意外管理工具npm的一個install指令,就可以把Koa裝到本地。
首先看一下在原生機器上使用Koa的例子。将Koa官網上的helloworld拷貝,它是通過Node.js的最基礎的依賴的加載機制,require把Koa這個子產品加載進來之後,它是一個class new一個Koa的執行個體,然後通過Koa的擴充方式,也就是Koa中間件方式,通過use加載Koa中間件,可以實作在一個非常小的核心上擴充web應用,它的Koa核心是一個非常簡單的代碼。
Koa中間件其實是一個很簡單的Function。這個Function會有一個ctx參數傳進來,這個ctx相比原生的Koa http協定更具吸引力的是,Koa它把原生的 http的request對象和response對象全都代理到了ctx對象上可。也就是說它把請求和響應的各種操作的方法全都代理到了ctx上了。
有學過Midway的同學會發現它們的ctx本質上都是Koa。關于Koa的ctx上面具體代理很多東西,大家可以到Koa的官網上檢視它的文檔。這樣一個簡單的代碼,它應用了一個最小的中間件,這個中間件就是直接拿到ctx,然後 ctx.body我們可以到官方文檔上面找到,在官網上ctx.body就是response.body。
Koa router這樣一個中間件的使用方式。在Koa group裡尋找中間件,裝好中間件。我寫個hi serverless,這裡加了一個路由,我們再加第二個,第二個取名叫api,然後它這種中間件的使用方式也是通過這些中間件,最後要傳回一個Function給Koa的APP。(示範成果)我們先通路的是/path,出來的就是hi serverless;再通路/api,出來的就是hi api。
3. 如何在雲上寫Koa應用?
上面所介紹和示範的都是在本地的Koa基礎使用。那麼如何在雲開發平台上寫Koa應用呢?
通常我們在Node.js裡面,把不同的path叫做不同的路由,特别是在Koa體系中,Koa和express這兩套體系主要的相關的這些衍生産品,他們都喜歡管不同的 http請求的path叫路由。本質上通過一個http請求的時候傳了不同的path,然後通過不同的path映射到不同的處理方法上。
我們這邊已經有一個已經ready的Koa的應用遷移方案,大家可以像前幾天學的去打開這個界面并建立一個應用,在選擇解決方案的時候去勾選Koa的應用遷移方案,然後完成建立。
完成建立後,點開發部署并進入雲上IDE的界面。雲上IDE可以讓我們直接在雲上寫代碼,還可以在雲上測試。這個整理好的Koa應用裡面,使用到了Koa router,這個router已經整理了好幾個經典的用法,并且還加了一個body parser中間件。
關于body parser中間件,要給大家提一下http這樣一個通信協定它本身是有不同的方法的,這個方法英文單詞叫Mess。不同的方法有不同的語意,雖然之前有幾個很火的文章和文章一直在讨論說http請求方法其實本質上沒有差別,但是它們本身有不同的語意,這些語意有一些僅僅是擷取資源而不做任何修改,有一些動作是會産生新的資源,這些新資源出來的一些http請求,通常是被稱之為那種有修改的請求。
body parser是專門用來去解析除了get請求,就是單純的擷取資源外的處理一些put請求,或post修改或是新增内容請求的資料body的解析中間件,這樣的中間件其實用法跟我們剛剛的router其實是類似的,它本質上也是會傳回一個函數,然後這個函數會傳給Koa,然後Koa的 up會把這些body parser的中間件,還有router這些中間件compose到一起,然後讓你順勢去使用它。
雲上Koa模闆跟本地跑的Koa,最大的差別是雲上的 APP。我們這個地方因為跟本地稍微有一點差別,是以在雲上的Koa的應用是需要把你的APP給通過module.exports給導出來,這樣我們的阿裡雲才能夠感覺到你的應用,然後才能使用,但是在本地或者是普通的伺服器上跑,大家是不需要做這個操作的。了解了差別之後,我們就會知道如把本地的Koa應用遷移到雲上的話,最主要的地方是把這個APP通過這樣一個方式給導出來就行了。
導出來之後,雲端的同學就知道有這樣一個APP,它的運作方式跟我們在本地其實是一樣的,我們這邊的話代碼叫APP.js。在雲上運作直接是Node APP.js。
4. 什麼是Koa中間件?
導出的APP會在背景運作應用時被require。Koa的中間件把自己定義為普通的function,然後每一個部分都有它自己的function,把這些function組合到一起,接連運作下去,這是Koa對中間件的定義。Koa中間件是它自己定義的一個擴充方法。Koa遵循的設計模式是跟Ruby on rails比較像的,它遵循的原則叫約定大于配置。Koa中間件做的約定是一個函數,它有兩個參數,一個ctx一個next,然後這樣子的一個函數可以作為一個中間件來使用。
由于Koa比較流行,是以在Node裡一般讨論中間件就是指Koa中間件。你也可以自己寫一個你覺得更好的中間件模型,如果你做的架構流行起來,那麼中間件的标準就會變成你的。然後我們在雲上跑跟在本地跑差別是差不多的。
比如說我寫一個body=hi,然後再寫一個,我在上面寫一個body=hi,這個約定大于配置是說函數本身的,現在我們開始讨論中間件到底是什麼東西,然後我把 ctx.body加等于相當于一個Alan,這裡就有兩個函數,這兩個函數都被Koa給使用了。
這裡的加号寫成了等号,這兩個函數就都被使用了。這兩個函數被組合使用,它一開始是body上是一個hi,然後在第二個函數被使用的時候,這個body就變成了一個hi加上Alan。這是一個很簡單的把這兩個函數組合起來的一個例子。
我們剛剛說了它有一個約定,就是有兩個參數一個ctx一個next,要調next,它才會幫你去調下一個函數。
我們嘗試調一下,hi Alan就出來了。然後 ctx和 next這兩個參數是Koa給你約定的,然後這個next是指向下一個函數,那麼一個函數套下一個函數,然後再繼續套下一個函數,就會發現我們可以很自由的在一個函數從一個Path。換句話說,比如說我們要實作一個 user register使用者注冊一個API的時候,在注冊之前,我們可以在這個函數數組上面的中間任意一個位置加上一個新的邏輯去過濾進來的請求。
比如說加一個安全的函數,就會發現所寫的函數不管在這中間的任何地方,它其實都處于邏輯中間,是以Koa的作者把這種函數叫做中間件。這個順序的話,誰先被它use就誰先出現在這個數組裡面,但是你也可以把APP上面的數組強行拉出來,然後塞到中間任意一個位置,去做邏輯的處理。
當你去寫函數的時候,你會發現這個函數可以很輕易的在你的整個邏輯鍊路的任何位置去做一個擴充,是以它擴充的時候,它就好像一個中間的東西,是以就把這個東西命名成了一個 middleware,是吧?它并不是一個什麼software,也不是一個hardware,它是一個middleware。它可以根據業務子產品着層處理,而且你可以把一些邏輯單獨用一個函數抽出來,然後去複用,在某些需要使用這個邏輯的路由上面,你再去挂這樣一個函數。
總結一下,當我們從本地的Koa應用遷移到雲上的一個很大的差別,是雲上的一個應用需要把APP導出來,然後在雲開發平台去把 Node的程序提起來,完成測試預覽,再輸入你的端口,然後去通路這個端口,才能去預覽Koa應用。