Skip to content

Latest commit

 

History

History
252 lines (167 loc) · 3.63 KB

2.x.md

File metadata and controls

252 lines (167 loc) · 3.63 KB

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模型里的请求和响应

  • this.request
  • this.response

对比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.request.query
  • this.query

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

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

  • 别名列表

Request aliases

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

  • ctx.header
  • ctx.method
  • ctx.method=
  • ctx.url
  • ctx.url=
  • ctx.originalUrl
  • ctx.path
  • ctx.path=
  • ctx.query
  • ctx.query=
  • ctx.querystring
  • ctx.querystring=
  • ctx.host
  • ctx.hostname
  • ctx.fresh
  • ctx.stale
  • ctx.socket
  • ctx.protocol
  • ctx.secure
  • ctx.ip
  • ctx.ips
  • ctx.subdomains
  • ctx.is()
  • ctx.accepts()
  • ctx.acceptsEncodings()
  • ctx.acceptsCharsets()
  • ctx.acceptsLanguages()
  • ctx.get()

Response aliases

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

  • ctx.body
  • ctx.body=
  • ctx.status
  • ctx.status=
  • ctx.length=
  • ctx.length
  • ctx.type=
  • ctx.type
  • ctx.headerSent
  • ctx.redirect()
  • ctx.attachment()
  • ctx.set()
  • ctx.remove()
  • ctx.lastModified=
  • ctx.etag=

如何获取 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里如何使用呢?

关于路由

  • express 是自带路由
  • koa 这货没有,所以,需要另外集成,koa-generator 使用的是目前比较流行的 koa-router(我喜欢它的是 Express-style )

好吧

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