前言express最新版本是4.16.2,所以本文的分析也是基于这个版本。目前从npm仓库来看,express的使用率相当高,express的月下载量是koa的40倍左右。因此,目前研究express还是很有意义的。源码分析直接切入正题,因为express目前是一个独立的路由和中间件web框架。因此,分析的方向主要以这两个为主。源码研究只关注关键步骤和流程思路,并没有过多关注具体的hack、异常、边界处理。关键步骤中间件的执行/***//负责具体请求的逻辑处理,当执行到一维层中对应的栈时,执行done(目的是匹配并执行next中的路由一维路由表)。*@paramdone(nextinrouting)*/Route.prototype.dispatch=functiondispatch(req,res,done){varidx=0;varstack=this.stack;下一个();//递归执行栈层中层通过nextfunctionnext(err){//如果出错,直接退出当前栈和路由列表中callback的后续执行if(err&&err==='router'){returndone(err)}//如果出现错误,直接退出当前栈列表,进行后续执行,继续进行下一条路由匹配if(err&&err==='route'){返回完成();}varlayer=stack[idx++];//执行结束if(!layer){returndone(err);}if(layer.method&&layer.method!==method){returnnext(err);}//调用特定的注册逻辑if(err){layer.handle_error(err,req,res,next);}else{layer.handle_request(req,res,next);}}};注意,以上是对源码的部分总结,去掉了无关信息,标注了关键步骤。路由匹配/***针对特定请求的路由分发处理*out是最后一个处理器,默认是请求的回调,如果不通过,就是内部提供的错误处理器*/proto.handle=functionhandle(req,res,out){varself=this;变量idx=0;varparamcalled={};//中间件和路由varstack=self.stack;vardone=restore(out,req,'baseUrl','next','params');下一个();//递归遍历注册的一维路由functionnext(err){varlayerError=err==='route'?空:错误;变层,匹配,路线;//取出注册的一个Routing,请求匹配while(match!==true&&idx
