首先简单介绍一下koa,想必大家都听过express框架的大名了,koa是Express框架的原班人马打造的新型框架,代码更少,使用更方便,反正我是这么认为的,后面出的总是要好的,哈哈。koa现在也已经出到了2.x版本,这个版本支持了es7的写法,可以肆无忌惮的使用async来用同步的方式编写异步代码了。
Application
看代码:
const Koa = require('koa');
const app = new Koa();
app.use(async ctx => {
ctx.body = 'Hello World';
});
app.listen(3000);
这段代码中有一个 app对象,这个就是Application.一个应用只会有一个Application对象,
koa官网是这么介绍的,Koa应用程序是一个对象,它包含了一系列的中间件(说白了,就是个方法),它们以类似于堆栈的方式在请求时进行组合和执行。
app.use就是将中间件push到了一个数组中,有请求来了就会执行这个方法。
app.context这个和ctx是一个原型,相通的。我们可以通过编辑app.context来添加一系列的属性。这个很有用,可以减少很多require()的使用,也不用多使用一个中间件来给ctx赋值了(中间件都有ctx参数)。一朝赋值,全盘可用。
app.context.db = db();
app.use(async ctx => {
console.log(ctx.db);
});
赋值了以后就可以在中间件的ctx参数中使用了。
Context
每当服务器接收到一个请求,应用程序都会实例化一个context对象,他封装了request和response对象,由于操作频繁,所以直接将这两个对象放到了这个级别来使用。
使用起来如下:
app.use(async ctx => {
ctx; // is the Context
ctx.request; // is a koa Request
ctx.response; // is a koa Response
});
官方提供了一个命名空间来赋值变量供其他模块使用,可以在中间件中组合使用。
app.use(async (ctx, next) => {
var user = tryGetUserFromCookie(ctx.request);
if (user) {
ctx.state.user = user;
await next();
} else {
ctx.response.status = 403;
}
});
渲染UI的时候都要给UI组件传一个model(数据对象)过去。如果写了上述代码,每次都要把user信息拼接到model中吗?肯定不是的。
Object.assign({}, ctx.state || {}, model || {})
首先,model || {}确保了即使传入undefined,model也会变为默认值{}。Object.assign()会把除第一个参数外的其他参数的所有属性复制到第一个参数中。第二个参数是ctx.state || {},这个目的是为了能把一些公共的变量放入ctx.state并传给View。
ctx.req,ctx.res是Node的对应对象。
值得注意的是,绕过koa的相应处理是不被支持的。所以下列操作要避免使用。
res.statusCode()
rst.wirteHead()
res.wirte()
res.end()
ctx.response,ctx.request是koa的对应对象。
ctx.app
Application的引用
ctx.throw
ctx.throw(400, ‘name required’)
更多的使用如Response以及Request参加官网即可