node平台express框架源码分析-2
2016-08-12 15:47
281 查看
上一篇文章源码分析-1分析了express启动加载的过程,重点是对router和route的管理。
以下面的用户请求为例:
router中按照用户定义的中间件和请求映射顺序注册处理栈,下面是一个完成初始化的处理栈截图,:
该栈中有6个layer,按照用户初始化顺序添加到数组中(前两个是express默认添加的),其中第三个layer用来处理/a/b的请求。
比如当用户在发送/a/b的请求的时候,在router中的layer栈中做循环处理,依次判断路径是否匹配,route是否为空,直到找到匹配的layer为止.
该layer的定义如下:
以下面的用户请求为例:
app.get("/a/b", function(req, res) { res.end("hello,world"); });
router中按照用户定义的中间件和请求映射顺序注册处理栈,下面是一个完成初始化的处理栈截图,:
该栈中有6个layer,按照用户初始化顺序添加到数组中(前两个是express默认添加的),其中第三个layer用来处理/a/b的请求。
比如当用户在发送/a/b的请求的时候,在router中的layer栈中做循环处理,依次判断路径是否匹配,route是否为空,直到找到匹配的layer为止.
该layer的定义如下:
proto.route = function route(path) { console.log("app.get(path,cb) path value:" + JSON.stringify(path)); var route = new Route(path); var layer = new Layer(path, { sensitive: this.caseSensitive, strict: this.strict, end: true }, route.dispatch.bind(route));//指定该layer的处理函数dispatch layer.route = route;//指定该layer对应的二级处理路由器 this.stack.push(layer); console.log("app.get(path,cb) return route:" + JSON.stringify(route)); return route; };然后调用layer的handle_request的方法
Layer.prototype.handle_request = function handle(req, res, next) { var fn = this.handle; if (fn.length > 3) { // not a standard request handler return next(); } try { fn(req, res, next); } catch (err) { next(err); } };其中的this.handler即在定义layer的时候指定的route的dispatch方法,调用fn方法即调用dispatch方法。
Route.prototype.dispatch = function dispatch(req, res, done) { var idx = 0; var stack = this.stack; if (stack.length === 0) { return done(); } var method = req.method.toLowerCase(); if (method === 'head' && !this.methods['head']) { method = 'get'; } req.route = this; next(); function next(err) { if (err && err === 'route') { return done(); } var layer = stack[idx++]; if (!layer) { return done(err); } if (layer.method && layer.method !== method) { return next(err); } if (err) { layer.handle_error(err, req, res, next); } else { layer.handle_request(req, res, next); } } };这里将用户的请求导入到了route的layer栈中(该栈在application.js中和router中的栈一同完成初始化)
var route = this._router.route(path);//注册router的layer栈 route[method].apply(route, slice.call(arguments, 1));//注入route的layer栈,该栈中的处理函数即用户定义的回调函数同router的栈处理顺序类似,不同的是这里的layer.handle_request最终调用的将是用户定义的回调函数,而不再是dispach函数。
相关文章推荐
- node平台express框架源码分析-1
- 应用框架的设计与实现——.NET平台(6 源码分析)
- 应用框架的设计与实现——.NET平台(7.事件通知服务.源码分析)
- Windows平台Ping示例源码分析(C/C++)
- HDFS datanode源码分析
- Cloud Foundry Service Node源码分析及实现【附下载】
- 应用框架的设计与实现——.NET平台(4.3 SAF代码分析.源码1)
- Cloud Foundry Service Node源码分析及实现
- Windows平台Ping示例源码分析(C/C++)
- NSIS脚本源码分析: 如何判断CPU平台类型
- hadoop datanode源码分析
- 应用框架的设计与实现——.NET平台(8.3 源码分析)
- 第二人生的源码分析(六十七)LLXMLNode使用Expat库打开文件
- 第二人生的源码分析(六十七)LLXMLNode使用Expat库打开文件
- 分享插件平台相关的源码分析——SharpDevelop、Composition Application Block、Eclipse OSGi、ObjectBuilder
- 应用框架的设计与实现——.NET平台(5 缓存服务.源码分析)
- 第二人生的源码分析(六十七)LLXMLNode使用Expat库打开文件
- 第二人生的源码分析(六十八)LLXMLNode使用Expat库分析XML文件
- hadoop datanode源码分析
- 函数平台底层之旅——DM9000网卡驱动源码分析