在我们编写koa代码的时候,会对body进行多次的读取和修改,所以真正返回浏览器信息的操作是在application.js里进行封装和操作。
koa2写入以下代码:
leturl=require('url');
module.exports={
getquery(){
returnurl.parse(this.req.url,true).query;
}
};
这样当你在koa实例里使用ctx.query的时候,就会返回url.parse(this.req.url,true).query的值。看源码可知,基于getter和setter,在request.js里还封装了header、url、origin、path等方法,都是对原生的request上用getter和setter进行了封装,笔者不再这里一一实现。
koa2文件代码模块
接下来我们实现response.js文件代码模块,它和request原理一样,也是基于getter和setter对原生response进行了封装,那我们接下来通过对常用的ctx.body和ctx.status这个两个语句当做例子简述一下如果实现koa的response的模块,我们首先创建好response.js文件,然后输入下面的代码:
module.exports={
getbody(){
returnthis._body;
},
setbody(data){
this._body=data;
},
getstatus(){
returnthis.res.statusCode;
},
setstatus(statusCode){
if(typeofstatusCode!=='number'){
thrownewError('somethingwrong!');
}
this.res.statusCode=statusCode;
}
};
总之,以上代码实现了对koa的status的读取和设置,读取的时候返回的是基于原生的response对象的statusCode属性,而body的读取则是对this._body进行读写和操作。这里对body进行操作并没有使用原生的this.res.end。