express之route.js
发布日期:2021-05-28 16:24:02 浏览次数:9 分类:技术文章

本文共 3422 字,大约阅读时间需要 11 分钟。

lib/router/route.jsmodule.exports = Route;//使用给定路径构造Route对象function Route(path) {  //设置路径  this.path = path;  //堆,用来存储Layer对象,不同的Layer对象处理不同http方法的请求,这里不做路径匹配  this.stack = [];  debug('new %o', path)  // 能够处理的http方法的对象,键为方法名,值为true或者false,特殊的键为_all代表可以处理所有http方法  this.methods = {};}//Route对象是否处理给定方法Route.prototype._handles_method = function _handles_method(method) {  //如果存在_all  if (this.methods._all) {    return true;  }  var name = method.toLowerCase();  //如果方法名为head且不能处理head方法,当做get方法对待  if (name === 'head' && !this.methods['head']) {    name = 'get';  }  //获取true或者false  return Boolean(this.methods[name]);};//支持的http方法数组Route.prototype._options = function _options() {  //获取键数组  var methods = Object.keys(this.methods);  //如果get存在,head不存在,添加head  if (this.methods.get && !this.methods.head) {    methods.push('head');  }  //全部小写  for (var i = 0; i < methods.length; i++) {    methods[i] = methods[i].toUpperCase();  }  return methods;};//分发请求、响应对象到指定的处理方法Route.prototype.dispatch = function dispatch(req, res, done) {  //堆中layer的下标  var idx = 0;  var stack = this.stack;  //堆的长度为0,直接回调  if (stack.length === 0) {    return done();  }  //请求方法名  var method = req.method.toLowerCase();  //如果为head方法且不能处理head时,当做get处理  if (method === 'head' && !this.methods['head']) {    method = 'get';  }  //设置route到请求对象上  req.route = this;  //调用下一步内部处理方法  next();  //next定义,这是递归调用方法  function next(err) {    //如果出错,为route代表离开当前Route对象    //这个错误在哪抛出还不知道    if (err && err === 'route') {      return done();    }    // router代表离开当前router对象    if (err && err === 'router') {      return done(err)    }    //获取当前Layer    var layer = stack[idx++];    //如果所有Layer获取完毕,执行回调    if (!layer) {      return done(err);    }    //如果Layer方法与请求方法不匹配,继续递归执行next    if (layer.method && layer.method !== method) {      return next(err);    }    //如果匹配且出错,调用layer的错误处理方法    if (err) {      layer.handle_error(err, req, res, next);    } else {      //这个才是正常处理对应的http请求的方法      layer.handle_request(req, res, next);    }  }};//添加一个所有http方法的处理器Route.prototype.all = function all() {  //扁平化参数,为函数数组  var handles = flatten(slice.call(arguments));  //遍历数组  for (var i = 0; i < handles.length; i++) {    var handle = handles[i];    //如果不是函数,抛出类型错误    if (typeof handle !== 'function') {      var type = toString.call(handle);      var msg = 'Route.all() requires a callback function but got a ' + type      throw new TypeError(msg);    }    //新建Layer对象,其路径为/,因为这个Layer不做路径匹配,只做方法匹配    var layer = Layer('/', {}, handle);    layer.method = undefined;    //设置Layer可以处理左右http方法    this.methods._all = true;    //添加到Route的堆里    this.stack.push(layer);  }  return this;};//遍历所有http方法,设置相应的函数,用来添加相应http方法的处理器methods.forEach(function(method){  //http方法名为属性名  Route.prototype[method] = function(){    //扁平化参数为函数数组    var handles = flatten(slice.call(arguments));    //遍历处理函数    for (var i = 0; i < handles.length; i++) {      var handle = handles[i];      //不是函数,抛出异常      if (typeof handle !== 'function') {        var type = toString.call(handle);        var msg = 'Route.' + method + '() requires a callback function but got a ' + type        throw new Error(msg);      }      debug('%s %o', method, this.path)      //新建Layer对象      var layer = Layer('/', {}, handle);      //设置Layer对象处理的http方法      layer.method = method;      //设置Route可以处理这个http方法      this.methods[method] = true;      //添加layer到堆      this.stack.push(layer);    }    return this;  };});

 

转载地址:https://blog.csdn.net/qq_27868061/article/details/79275743 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:express之layer.js
下一篇:express之router

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年02月09日 23时36分21秒