基于 Node.js 平台的下一代 web 开发框架
koa 的源码位于 lib 目录,结构非常简单和清晰,只有四个文件:
application.js
context.js
request.js
response.js
Application类
Application 类定义继承自 Emitter.prototype ,这样在实例化Koa后,可以很方便的在实例对象中调用 Emitter.prototype 的原型方法。
/**
* Expose `Application` class.
* Inherits from `Emitter.prototype`.
*/
module.exports = class Application extends Emitter {
constructor(options) {
super();
options = options || {};
this.proxy = options.proxy || false;
this.subdomainOffset = options.subdomainOffset || 2;
this.proxyIpHeader = options.proxyIpHeader || 'X-Forwarded-For';
this.maxIpsCount = options.maxIpsCount || 0;
this.env = options.env || process.env.NODE_ENV || 'development';
if (options.keys) this.keys = options.keys;
this.middleware = [];
this.context = Object.create(context);
this.request = Object.create(request);
this.response = Object.create(response);
if (util.inspect.custom) {
this[util.inspect.custom] = this.inspect;
}
}
}
上面的构造函数中,定义了Application实例的11个属性:
属性含义proxy表示是否开启代理,默认为false。如果开启代理,对于获取request请求中的host,protocol,ip分别优先从Header字段中的 X-Forwarded-Host , X-Forwarded-Proto , X-Forwarded-For 获取。subdomainOffset子域名的偏移量,默认值为2,这个参数决定了request.subdomains的返回结果。proxyIpHeader代理的 ip 头字段,默认值为 X-Forwarded-For 。maxIpsCount最大的ips数,默认值为0,如果设置为大于零的值,ips获取的值将会返回截取后面指定数的元素。envkoa的运行环境, 默认是development。keys设置签名cookie密钥,在进行cookie签名时,只有设置 signed 为 true 的时候,才会使用密钥进行加密。middleware存放中间件的数组。context中间件第一个实参ctx的原型,定义在 context.j s中。requestctx.request的原型,定义在 request.js 中。responsectx.response的原型,定义在 response.js 中。[util.inspect.custom]util.inspect 这个方法用于将对象转换为字符串, 在node v6.6.0及以上版本中 util.inspect.custom 是一个Symbol类型的值,通过定义对象的[util.inspect.custom]属性为一个函数,可以覆盖 util.inspect 的默认行为。
use(fn)
use(fn) 接受一个函数作为参数,并加入到 middleware 数组。由于koa最开始支持使用generator函数作为中间件使用,但将在3.x的版本中放弃这项支持,因此koa2中对于使用 generator 函数作为中间件的行为给予未来将被废弃的警告,但会将 generator 函数