connect模块的源码解读
源码链接
读了好几天connect的源码,我也来写写我的理解
function createServer() {
function app(req, res, next){ app.handle(req, res, next); }
merge(app, proto); //merge工具的使用,把两个对象的 *属性* 挖出来合并到一个对象之中
merge(app, EventEmitter.prototype);
app.route = '/';
app.stack = [];
return app;
}
proto是一个需要和app对象合并的对象
proto.listen = function listen() {
var server = http.createServer(this); //this其实指代的是app对象,app是一个函数对象
return server.listen.apply(server, arguments);
};
call 函数
/**
* Invoke a route handle.
* @private
*/
function call(handle, route, err, req, res, next) {
//handle函数的参数个数(3个参数为一般中间件,4个参数为错误处理中间件)
var arity = handle.length; //arity是参数数量的意思,这里handle.length是对函数调用length,意味着获取函数的期望参数的个数
//是否有错误
var error = err;
var hasError = Boolean(err);
debug('%s %s : %s', handle.name || '<anonymous>', route, req.originalUrl);
try {
if (hasError && arity === 4) { //如果有错误而且handle函数是一个错误处理中间件
// error-handling middleware
handle(err, req, res, next);
return; //函数被切断
} else if (!hasError && arity < 4) {
// request-handling middleware
handle(req, res, next);
return; //函数被切断
}
} catch (e) {
// replace the error
error = e;
}
// continue
next(error);
}