您的位置:首页 > Web前端 > Node.js

node平台express框架源码分析-2

2016-08-12 15:47 281 查看
上一篇文章源码分析-1分析了express启动加载的过程,重点是对router和route的管理。

以下面的用户请求为例:

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函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: