当前位置: 首页 > 后端技术 > Node.js

koa

时间:2023-04-03 19:06:38 Node.js

的源码写在上一篇文章中。这篇文章就带大家看一下koa的源码。当然,本文需要你了解koa的中间件机制。如果你之前没有了解过它的实现原理,可以关注这篇文章。koa的源代码非常精简。与express不同的是,koa只是给开发者搭建了一个架子,没有任何功能,包括路由,全部由中间件实现;我们来看看koa的实现:koa在创建应用的时候,一般会使用app.listen来指定一个端口号。这个方法的本质是http.createServer:listen(){debug('listen');constserver=http.createServer(this.callback());返回服务器。听。apply(server,arguments);}最重要的是这个回调的实现:callback(){constfn=compose(this.middleware);if(!this.listeners('error').length)this.on('error',this.onerror);consthandleRequest=(req,res)=>{res.statusCode=404;constctx=this.createContext(req,res);constonerror=err=>ctx.onerror(err);consthandleResponse=()=>respond(ctx);onFinished(res,onerror);返回fn(ctx).then(handleResponse).catch(onerror);};returnhandleRequest;}注意以下几点:onFinished(res,onerror),处理返回body是Stream的情况,给它添加一个finished事件。respond()根据ctx的status、body、method决定如何响应这个请求:status为204、304,不需要响应body,res.了解资源情况,所以只需要请求头。指定资源长度后,res.end()只是把body添加为空,那么body就是statuses包中status对应的文字描述,比如404=>NotFoundcontextobjectkoa会requestobjectresponse是封装到一个对象中,并提供一些别名。详情请参考上下文对象。比如访问ctx.url,实际上是访问ctx.request.url。具体实现是使用tj写的delegatesnpm包给context对象添加属性。koa中使用了其中三个:method:addmethodreferencegetter:use__defineGetter__,addgetterattributeaccess:addgetterandsetterforcontextCreatedcode:createContext(req,res){constcontext=Object.create(this.context);constrequest=context.request=Object.create(this.request);constresponse=context.response=Object.create(this.response);context.app=request.app=response.app=this;context.req=request.req=response.req=req;context.res=request.res=response.res=res;request.ctx=response.ctx=上下文;请求.响应=响应;response.request=请求;context.originalUrl=request.originalUrl=req.url;context.cookies=newCookies(req,res,{keys:this.keys,secure:request.secure});request.ip=request.ips[0]||req.socket.remoteAddress||'';context.accept=request.accept=接受(请求);context.state={};返回上下文;}函数的参数req和res是node本身的对象,request和response分别是req和res的包。读取ctx.url的过程如下:context是一个顶级对象。在koa中,所有的属性和操作基本都是基于这个对象。这个对象的组成如下:写在最后,个人感觉koa就像一个架子,提供了基本的方法和属性,比如ctx.redirect等,具体的功能主要是通过中间件来实现的。koa相比express,去掉了内置的路由,视图等,变得更重要了,当然我觉得更重要的是避免层层回调的出现。以上内容如有错误,欢迎大家指出。