Koajs中间件的定义(一)Koajs中间件的下篇(二)Koajs中间件的来龙去脉(三)我们在第一篇文章中说过,“在Koa中,中间的A组件指的是一个独立的连接整个Koa应用并共享资源的插件”,注意两个词,“coherent”和“sharedresources”,与上面的代码一一对应,“coherent”对应“next”,“shared”资源对应上下文”。在Koa中,通过context来处理context,下面分析context。上下文初始创建createContext(req,res){constcontext=Object.create(this.context);constrequest=context.request=Object.create(this.request);constresponse=context.response=Object.create(this.response);...context.state={};returncontext;}不断创建和调用context对象,避免对context造成影响。初始上下文对象使用Object.create()来克隆对象。context包含几个主要的三个属性,其中比较重要的是request、response、state。Koa提供了request.js和response.js来处理原始的req和res对象,使其更易于操作。比如在request.js中,将req原来的请求参数从字符串类型替换为对象类型,"?a=1&b=2"<=>{a:1,b:2}.delegates为了简化context的操作,Koa读取context中需要调用的方法和属性,进行delegation,有兴趣的可以研究下delegates库。委托(proto,'response').method('attachment').method('redirect').method('remove').method('vary').method('set').method('append').method('flushHeaders').access('status').access('message').access('body').access('length').access('type').access('lastModified').access('etag').getter('headerSent').getter('writable');比如我们常用的“ctx.redirect(xxx)”方法等同于ctx.reponse.redirect(xxx);比如输出内容ctx。body='xxx'相当于ctx.response.body='xxx';set&get处理上下文中一些值的设置,进行setget处理,比如bodyobjectgetbody(){returnthis._body;},setbody(val){constoriginal=this._body;这个._body=val;如果(this.res.headersSent)返回;//没有内容if(val==null){if(!statuses.empty[this.status])this.status=204;this.remove('内容类型');this.remove('内容长度');this.remove('传输编码');返回;}//设置状态if(!this._explicitStatus)this.status=200;//仅当尚未设置内容类型时才设置内容类型constsetType=!this.header['content-type'];//字符串if(typeofval=='string'){if(setType)this.type=/^\s*
