https://github.com/koajs/koa/tree/2.0.0-alpha.3
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 里的 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
和 response
2 个对象,每次写起来又比较麻烦
于是把 request
和 response
上的方法也丢给 this
,这样就相当于 this
上有了对应 request
和 response
里的方法的别名(简写方式)
Request aliases
以下访问器和别名与 Request
等价:
Response aliases
以下访问器和别名与 Response
等价:
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