koa-generator-examples

koa-2.x

https://github.com/koajs/koa/tree/2.0.0-alpha.3

koa 基础

http://koa.bootcss.com/

上下文

koa 的中间件

app.use((ctx, next) => {
  const start = new Date;
  return next().then(() => {
    const ms = new Date - start;
    console.log(`${ctx.method} ${ctx.url} - ${ms}`);
  });
});

说明:this 是上下文

http模型里的请求和响应

对比express的中间件

app.use(function (req, res, next) {
  return next();
});

express 里的 reqres 是显式声明,看起来更清晰一些

next 处理是一样的,二者无差异

koa-generator

安装koa-generator

npm install -g koa-generator

创建项目

koa helloworld

HTTP

Get

npm run 1

如何获取query参数

routes/index.js

const router = require('koa-router')();

router.get('/', function *(next) {
  console.log(this.request.query)
  console.log(this.query)
  
  yield this.render('index', {
    title: 'Hello World Koa!'
  });
});

module.exports = router;

访问 http://127.0.0.1:3000/?a=1

日志

  <-- GET /?a=1
{ a: '1' }
{ a: '1' }

和 express 里获取 query 的方法是一样的,req.query

koa 里是

这里需要说明以下 this 上下文上有 requestresponse 2 个对象,每次写起来又比较麻烦

于是把 requestresponse 上的方法也丢给 this,这样就相当于 this 上有了对应 requestresponse 里的方法的别名(简写方式)

Request aliases

以下访问器和别名与 Request 等价:

Response aliases

以下访问器和别名与 Response 等价:

如何获取 params

express 里经典用法

http://expressjs.com/en/4x/api.html#app.param

app.get('/user/:id', function (req, res, next) {
  console.log('although this matches');
  next();
});

请求是

访问 http://127.0.0.1:3000/users/alfred

那么koa里如何使用呢?

关于路由

好吧

routes/users.js

const router = require('koa-router')();

router.get('/:id', function *(next) {
  console.log(this.params);
  console.log(this.request.params);
  this.body = 'this a users response!';
});

module.exports = router;

执行

npm run 2

访问 http://127.0.0.1:3000/users/alfred

日志

  <-- GET /users/alfred
{ id: 'alfred' }
undefined
GET /users/alfred - 28

首先肯定一点,this.params 是可以取到 params 的,这点和 express 路由用法类似

但是注意的是

this.request.params != this.params

这说明 params 不是 request 上的方法,翻查源码,确实是如此

https://github.com/alexmingoia/koa-router/blob/5.x/lib/router.js#L317

Post

上传

流程控制

co

async/await

promise with bluebird