Koa入門教程[1]-開端

前言

Koa 是一個精緻小巧的基於 Node.js 的 Web 框架。目前有 1.x2.x 2 個大的版本css

其中 2.x 版本使用了 Node.js v7.6.0 以後支持的 async await 語法糖,提供了更優雅的異步編程模式。web

Koa 有以下特色:express

  • 內核精簡,不內置中間件. 小巧但富有表現力。
  • 相似棧的方式運行中間件,Koa 調用下游,而後堆棧展開再將控制再流回上游。簡單實用
  • 實用async await或generator避免了callback hell
  • 優雅的異常捕獲

Koa 經過上面的機制避免了以往 connect 等實現的一些問題,例如要實現一個耗時統計時須要將 startTime 層層傳遞到末尾中間件。Koa 與 express 和 connect 的差異以下:npm

express koa 對比

爲了一探 Koa 的全貌,咱們基於 Koa 1.x 的版原本開始學習之旅(主要是爲了學習generator,其餘方面1和2其實原理是同樣的)。後面計劃的教程以下:編程

  1. 開端。安裝和啓動
  2. 經常使用中間件
  3. 錯誤處理和最佳實踐
  4. 開發並部署一個 todo-list 應用
  5. 升級爲 Koa2
  6. 初探 Koa 源碼

安裝

使用 Koa 搭建一個 Web 應用是極其簡單的。Koa 模塊暴露了一個 Application 的 class 給 Web 開發者,咱們只需實例化這個 Application,並給它注入適當的 請求和響應處理邏輯. 實際上,整個 Koa 應用的開發模式就是如此簡單。json

下面是步驟:bash

  1. 進入咱們的項目目錄,安裝 Koa
# 初始化 package.json
npm init
# 安裝 Koa 1.x
npm i koa@1 -d
  1. 在咱們的項目目錄建立一個 index.js 文件,用於編寫 Web 站點的主要邏輯
const Koa = require('koa')
const app = new Koa() // 實例化一個 Koa 應用
app.listen(3000) // 讓 Koa 啓動內置 server

這樣應用便啓動了,並監聽了本機的 3000 端口。 實際上 http server 也能夠不禁 Koa 來啓動,你能夠導出 Koa 的handler,配合本身的 TSW 或 其餘 Server 來使用:app

const server = http.createServer(app.callback())
server.listen(3000)

上面的代碼目前尚未任何的請求處理邏輯。Koa 是經過給 application 注入中間件函數的方式來注入 業務邏輯。框架

中間件

Koa的中間件很像Express的中間件,也是對HTTP請求進行處理的函數,可是必須是一個Generator函數。並且,Koa的中間件是一個級聯式(Cascading)的結構,也就是說,屬因而層層調用,第一個中間件調用第二個中間件,第二個調用第三個,以此類推。上游的中間件必須等到下游的中間件返回結果,纔會繼續執行,這點很像遞歸

從中間件的執行流程能夠看出,第一個被執行的中間件,其也會在最後再次回到該中間件並執行剩下的代碼邏輯。koa

Koa 的中間件依次執行來處理接收的 requests 並響應一個 response。每個中間件都能訪問到 context 對象,這是一個封裝了原生 Node 請求和響應的對象,並提供了許多開發 web 應用和 API 有用的方法。在 Koa 1 裏面,每一箇中間件就是一個 Generator 函數,咱們看這個例子:

const Koa = require('koa')
const app = new Koa() // 實例化一個 Koa 應用
// 日誌中間件
const mylogger = function *(next) {
    yield next
    // 在 Koa1版本 的Generator中間件函數中,this表示context對象
    const rt = this.response.get('X-Respnose-Time')
    console.log(`${this.method} ${this.url} - ${rt}`)
}

// x-response-time 中間件
const mytime = function *(next) {
    const start = Date.now()
    yield next
    const ms = Date.now() - start
    this.set('X-Response-Time', `${ms}ms`)
}

// 業務邏輯
const mylogic = function *(next) {
    this.body = 'hello koa 1'
}

app.use(mylogger)
app.use(mytime)
app.use(mylogic)
app.listen(3000) // 讓 Koa 啓動內置 server

這個例子裏,給 Koa 傳入了 3 箇中間件,每一箇中間件是個 Koa1.x 支持的 Generator 函數。基於 Generator 的支持,咱們能夠在裏面書寫異步代碼,使用 yield 來暫停函數的執行。

基於首箇中間件內 Generator 異步的調用,整個 Koa 中間件至關於被捲入一個棧中,並造成以下的調用順序:

|  ↑
|  |
|  |
|  |
↓  |

在控制檯,咱們能夠看到打印出了一次請求的耗時。

GET / - 1ms

學習思路

學習 Koa, 其實就是學習 Koa 的 4 個對象:

  • Application 類型的實例屬性和方法(主要用做 Web 應用的設置和啓動)
  • context 上下文對象, 它是包裹了 Node.js 的 http request 和 response 對象, 同時又提供了 Koa 的一些方法和屬性供開發者使用
  • Koa request 對象。這個即是 context.request(Koa 1 裏面是 this.request) ,是 Koa 爲了開發方便提供的一些跟 http 請求相關的方法
  • Koa response 對象。這個即是 context.response(Koa 1 裏面是this.response),是 Koa 爲了開發方便提供的跟 http 響應有關的方法

所以實際上咱們能夠簡單理解爲,編寫中間件代碼時,只須要學習一個對象: context。context 對象會在 Koa 接收到任意一個請求後,執行中間件以前初始化,並傳遞給中間件。它有以下幾個必要的屬性:

  • request:指向Request對象
  • response:指向Response對象
  • req:指向Node的request對象
  • res:指向Node的response對象
  • app:指向App對象
  • state:用於在中間件傳遞信息。

更多的屬性和方法文檔,直接參考官網好了

路由

Koa 核心不攜帶任何中間件,路由也是。後面咱們會介紹路由中間件的原理和用法。

視圖渲染

Koa 核心不包含任何模板引擎的支持,若是需渲染視圖,咱們須要引入相應的視圖中間件。

總結

Koa 提供了比 express 更精簡的內核,相似 connect 的中間件機制,更 fasion 的異步流程控制方法(1.x 是 generator 2.x 是 async 語法)。兼具精簡、高效、靈活性,是個優秀和值得學習的框架

相關文章
相關標籤/搜索