用npm下载KOA npm
就会在koa文件夹下生成app
我下载的KOA版本号是2.0.1koa
const Koa = require('koa'); const app = new Koa(); // response app.use(ctx => { ctx.body = 'Hello Koa'; }); app.listen(3000);
必定注意版本号1.2,应该是这样写的异步
let koa = require('koa'); let app = koa(); app.use(function*(){ this.body = "hello xiaomo"; }); app.listen(8080);
刚开始我下载的是2.0版倒是照着1.2版本的代码写的会报错。async
关键词 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
我分解一下这个程序:ui
inc 函数定义了一个生成器函数,在每一次 while 循环中,产出 number 变量而后 number 变量加 1inc 函数被指派给了变量 testthis
inc 函数被迭代了 3 次,第一次的时候,number 变量在函数中被初始化了。而后,这个函数进入到了一个 while 循环,在以后的迭代中这个循环也不会退出。而后 number 0 被产出,因此这个能够用 .value 方法接收。在后来的迭代中这个变量 number 自增了两次。url
我但愿这能够帮助理解一点生成器的工做原理。这只是很是复杂的 ES6 中的一小部分。spa
可是不管如何,让咱们回到 koa。koa 很是简单,甚至不包含一个路由。你须要在中间件生成器函数中手动作路由匹配:
请求先通过 x-response-time
和 logging
中间件,并记录中间件执行起始时间。 而后将控制权交给 reponse
中间件。当中间件运行到 yield next
时,函数挂起并将控制前交给下一个中间件。当没有中间件执行 yield next
时,程序栈会逆序唤起被挂起的中间件来执行接下来的代码。
ES7(目前是草案,尚未发布)引入了新的关键字async
和await
,能够轻松地把一个function变为异步模式:
const Koa = require('koa'); const app = new Koa(); // x-response-time app.use(async function (ctx, next) { const start = new Date(); await next(); const ms = new Date() - start; ctx.set('X-Response-Time', `${ms}ms`); }); // logger app.use(async function (ctx, next) { const start = new Date(); await next(); const ms = new Date() - start; console.log(`${ctx.method} ${ctx.url} - ${ms}`); }); // response app.use(ctx => { ctx.body = 'Hello World'; }); app.listen(3000);
在KOA1.0时实现异步,是这样实现的。
var koa = require('koa'); var app = koa(); app.use('/test', function *() { yield doReadFile1(); var data = yield doReadFile2(); this.body = data; }); app.listen(3000);
在KOA2.0是这样实现的
app.use(async (ctx, next) => { await next(); var data = await doReadFile(); ctx.response.type = 'text/plain'; ctx.response.body = data; });
参考:http://www.tuicool.com/articles/EnuiIj