koa跟express都是出自tj大神,它对外的宣称是下一代web开发框架。给我的感觉是,它更 加简洁、更加原理callbcak hell。

它使用co + generator + promise/plus来解决异步回调问题,在2.x中,直接抛弃 co这一套做法,直接使用async + promise的方案来解决异步回调。

我们来一个简单的hello worl来作为开篇。

import Koa from 'koa';
let app = new Koa();

app.use(async function(ctx, next){
  let start = new Date();
  await next();
  ctx.body += new Date() - start;
})

app.use(async function(ctx, next){
  ctx.body = 'hello world';
})

app.listen(3000);

可以看到,跟express类似,使用app.use来使用中间件,只不过2.x中,中间件必须是 async函数。

中间件:如果把处理http请求的过程比喻成污水处理的过程,那么中间件就是滤网,去 处理http请求,改写对应的res或req。

koa使用中间件来添加功能方法。中间件函数有两个参数ctx和next。ctx指的是中间件的上 下文,一般绑定了koa自己的request对象和response对象的方法,还有一些app的方法。next 函数则是将执行权交给下个函数。

koa的api:

  • app.listen()
  • app.use()
  • app.keys
  • app.callback()

koa中的上下文对象ctx:

  • ctx.req = http request
  • ctx.res = http response
  • ctx.app 当前的app实例
  • ctx.state 中间件之间传递的状态、数据
  • ctx.cookie cookie的操作
  • ctx.throw 中断请求,给客户端放回对应的状态码和消息。
      ctx.throw(404, 'not found');
    
  • ctx.assert() 断言
  • ctx.request
    • ctx.header
    • ctx.mehod
    • ctx.url
    • ctx.path
    • ctx.query
    • ctx.queryString
    • ctx.search
    • ….
  • ctx.response
    • ctx.body
    • ctx.get
    • ctx.set
    • ctx.remove
    • ctx.redirect
    • ctx.attachment
    • ctx.lastModified
    • ….

koa本身很简洁,几乎没有什么功能。就是靠这些第三方中间件来扩充功能。