koa.js 上手

weixin_33758863發表於2015-04-09

原文:https://medium.com/@schisma/get-started-with-koa-js-2269b37567cf
最近大家討論了很多關於 ES6。這個 JavaScript 的下一個版本將會包含一些新的特性,如更好的變數作用域,生成器,字串模板等。但是在我們討論這些之前,已經有 node.js 的框架使用了 ES6 的新特性生成器。Koa 已可以執行在當前的執行環境,需要使用 --harmony 標記預設開啟 ES6 特性,由 Express 原班人馬打造。隨著 io.js 的完成,我覺得是時候為 koa 釋出一個好的引導了。

讓我們開始 koa 上手。這段程式的作用是監聽 8080 埠,當收到 GET 請求的時候,答覆 hello world

let koa = require('koa')
 
let app = koa();
 
app.use(function* () {
 this.body = 'hello world'
})
 
app.listen(8080)

你應該注意到了,我沒有隻用 var 關鍵詞。我使用了 let 代替。在 ES6 中這基本上就是新的 var。這改變了變數的作用域,但是我不想在這裡多說。

另一件事情有些奇怪,就是我們使用關鍵詞 function*。這個星號表示這個函式是一個生成器函式。這意味著這個函式可以在執行的時候跳出然後再跳回來。這個概念很難去表述,所以我給你舉個例子。

function* inc () {
 let number = 0
 while (true)
 yield number++
}

let test = inc()

console.log(test.next().value) // -> 0
console.log(test.next().value) // -> 1
console.log(test.next().value) // -> 2

我分解一下這個程式:

  1. inc 函式定義了一個生成器函式,在每一次 while 迴圈中,產出 number 變數然後 number 變數加 1
  2. inc 函式被指派給了變數 test
  3. inc 函式被迭代了 3 次,第一次的時候,number 變數在函式中被初始化了。然後,這個函式進入到了一個 while 迴圈,在之後的迭代中這個迴圈也不會退出。然後 number 0 被產出,所以這個可以用 .value 方法接收。在後來的迭代中這個變數 number 自增了兩次。

我希望這可以幫助理解一點生成器的工作原理。這只是非常複雜的 ES6 中的一小部分。

但是無論如何,讓我們回到 koa。koa 非常簡單,甚至不包含一個路由。你需要在中介軟體生成器函式中手動做路由匹配:

let koa = require('koa')

let app = koa()

// normal route
app.use(function* (next) {
 if (this.path !== '/') {
 return yield next
 }

 this.body = 'hello world'
});

// /404 route
app.use(function* (next) {
 if (this.path !== '/404') {
 return yield next;
 }

 this.body = 'page not found'
});

// /500 route
app.use(function* (next) {
 if (this.path !== '/500') {
 return yield next;
 }

 this.body = 'internal server error'
});

app.listen(8080)

你可以看到,我們只要用 if 就可以做路由匹配了。你是不是很疑惑在這個上下文中的 this 是什麼,express 中的 req 和 res 去哪裡了。其實 this 繫結了大部分的 req 和 res 的函式和屬性。如果你想知道更多關於 this 的詳情,請點這裡

讓我們寫一個將請求中的內容大寫的中介軟體:

let koa = require('koa')

let app = koa()

app.use(upcaser())

function upcaser () {
 return function* (next) {
 yield next
 this.body = this.body.toUpperCase()
 }
}

app.listen(8080) 

我希望在這個引導可以幫助你理解 Koa,生成器和 ES6。koa 非常簡單,記住 koa 基本上就是一箇中介軟體框架。我現在推薦你去閱讀一下 官方文件。拜拜。

相關文章