https://github.com/koajs/koa/tree/2.0.0-alpha.3
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 里的 req
和 res
是显式声明,看起来更清晰一些
next
处理是一样的,二者无差异
npm install -g koa-generator
koa helloworld
npm run 1
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
上下文上有 request
和 response
2 个对象,每次写起来又比较麻烦
于是把 request
和 response
上的方法也丢给 this
,这样就相当于 this
上有了对应 request
和 response
里的方法的别名(简写方式)
- 别名列表
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=
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