之前我一直使用rails搭建網(wǎng)站。rails與koa的基本理念很相似,都是基于中間件提供一層層的服務(wù)。所不同的是,rails有很多內(nèi)置的中間件,這使得開(kāi)發(fā)者只需要關(guān)注MVC模塊以及頁(yè)面路由。而Koa這相對(duì)靈活很多,除了nodejs提供的http模塊服務(wù),其它的中間件都需要自己添加。
如果對(duì)于網(wǎng)站開(kāi)發(fā)不熟練,往往會(huì)不知道該添加哪些中間件。這篇文章就結(jié)合流程圖講解一下開(kāi)發(fā)網(wǎng)站大致需要的中間件。

安全檢查
檢查request的header,只允許符合安全的請(qǐng)求通過(guò)。安全檢查最流行的庫(kù)是koa-helmet??梢酝ㄟ^(guò)koa-helmet做下面這些檢查:
- clickjacking
- 移除X-Powered-By
- 限制只通過(guò)https
- xss攻擊過(guò)濾
- 偽造證書(shū)攻擊
更多的檢查大家可以查看koa-helmet的文檔。
數(shù)據(jù)預(yù)處理
http模塊并不會(huì)解析傳過(guò)來(lái)的數(shù)據(jù)。像表格里的數(shù)據(jù),文件,json,xml都需要手動(dòng)處理。數(shù)據(jù)預(yù)處理模塊就是對(duì)這些數(shù)據(jù)進(jìn)行處理的過(guò)程。處理完之后,可以通過(guò)鍵值在ctx.request里讀取這些數(shù)據(jù)。比較流行的數(shù)據(jù)預(yù)處理模塊可以參見(jiàn)koa-bodyparser
靜態(tài)資源
某些資源可以直接通過(guò)靜態(tài)資源,這樣可以省去路由,控制器,等的開(kāi)銷(xiāo)??梢酝ㄟ^(guò)koa-static設(shè)置靜態(tài)資源路徑。當(dāng)路徑匹配時(shí),可以直接找到靜態(tài)資源。
路由
根據(jù)URL尋找對(duì)應(yīng)的控制器以及視圖。比較常見(jiàn)的中間件有(koa-route)[https://www.npmjs.com/package/koa-route], (koa-router)[https://www.npmjs.com/package/koa-router]
身份驗(yàn)證
進(jìn)行身份驗(yàn)證,并提供簡(jiǎn)單的API來(lái)確認(rèn)是否驗(yàn)證成功,log in以及l(fā)og out。這個(gè)模塊相對(duì)比較復(fù)雜,我也需要花更多時(shí)間來(lái)研究。用的比較多的有koa-passport, koa-jwt
業(yè)務(wù)邏輯與數(shù)據(jù)獲取
這個(gè)模塊是網(wǎng)站開(kāi)發(fā)者主要投入精力的地方。其具體實(shí)現(xiàn)隨網(wǎng)站的需求不同而變化。
視圖
選擇視圖模版。常見(jiàn)的模版有pug(jade), handlebars, hbs等。詳情請(qǐng)看koa-pug, [koa-handlebars](https://www.npmjs.com/package/koa-handlebars], koa-hbs。
緩存
通過(guò)設(shè)置etag來(lái)判斷內(nèi)容是否改變。若etag未變化,則返回304給客戶(hù)端。否則返回帶有內(nèi)容的回復(fù)。可以使用(koa-etag)[https://www.npmjs.com/package/koa-etag]與(koa-conditional-get)[https://www.npmjs.com/package/koa-conditional-get]來(lái)實(shí)現(xiàn)基于etag的緩存
壓縮
將最終的輸出打包。比較流行的打包庫(kù)為koa-compress 。
其他中間件
logger
koa-logger在請(qǐng)求來(lái)臨和返回時(shí)輸出在控制臺(tái)輸出簡(jiǎn)單的信息。error
koa-error可以對(duì)服務(wù)器拋出的異常進(jìn)行捕捉,并設(shè)置模版進(jìn)行渲染session
koa-session在服務(wù)器端設(shè)置網(wǎng)站的session
參考資料