koa.js 上手
原文: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
我分解一下這個程式:
- inc 函式定義了一個生成器函式,在每一次 while 迴圈中,產出
number
變數然後number
變數加 1 - inc 函式被指派給了變數 test
- 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 基本上就是一箇中介軟體框架。我現在推薦你去閱讀一下 官方文件。拜拜。
相關文章
- 手寫Koa.js原始碼JS原始碼
- 基於Koa.js的微信工具類小記JS
- 【Koa.js Blueprints】搭建一個基本 Koa 應用JS
- 基於 Koa.js 的 Node.js MVC 框架Node.jsMVC框架
- 上手mongodbMongoDB
- 記一次對Koa.js middleware的原始碼貢獻JS原始碼
- Redis 快速上手Redis
- 快速上手BootstrapVuebootVue
- ElasticJob 快速上手AST
- Flask快速上手Flask
- JDBC快速上手JDBC
- docker 快速上手Docker
- Linux上手Linux
- 【零基礎上手JavaWeb】快速上手 JavaScript DOM操作WebJavaScript
- React Native 上手React Native
- UIStackView上手教程UIView
- Flask之旅: 快速上手Flask
- MongoDB 簡單上手MongoDB
- Vue框架快速上手Vue框架
- Elasticsearch上手指南Elasticsearch
- Parcel上手實踐
- 線上手冊&工具
- Mac HomeBrew上手教程Mac
- 快速上手之dockerDocker
- VUE從零開始系列(上手),呆萌小白上手VUEVue
- 快速上手前端框架layui前端框架UI
- MacOS Catalina 上手Mac
- Git和GitHub快速上手Github
- 20分鐘上手 webAssemblyWeb
- Docker 快速上手指南Docker
- Zalando Postgres Operator 快速上手
- 快速上手 vue3Vue
- LLaMA快速上手指南
- 『Ansible 上手指南』
- 怎麼上手前端工具前端
- Git 快速上手精華梳理Git
- vue.js快速上手Vue.js
- JStorm Storm 上手demoJSORM