express框架route.js源码解析

2023-11-01

route.js并不是express里真正的路由代码,他只是其中的一个组成部分,和router(router/index.js)是有区别的。下面先看一下重要的代码。

function Route(path) {
  this.path = path;
  this.stack = [];
  // route handlers for various http methods
  this.methods = {};
}

Route.prototype.dispatch = function dispatch(req, res, done) {//done是router的next函数,执行后会跳到下一个中间件,从而跳过当前route的stack中剩下的函数
  var idx = 0;
  var stack = this.stack;
  if (stack.length === 0) { 
    return done();//done是开始执行该路由组件时传进来的回调,执行完路由栈里的函数后执行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') {//使用next('route')会不执行剩下的函数
      return done();
    }

    var layer = stack[idx++];
    if (!layer) {//已经遍历完layer了,跳到下一个router中的layer
      return done(err);
    }

    if (layer.method && layer.method !== method) {//方法不匹配,next
      return next(err);
    }

    if (err) {//通过层层筛选,最后可以执行的路由函数,先判断有没有错误,再执行相应的函数,每个layer都有对应的回调。
      layer.handle_error(err, req, res, next);
    } else {
      layer.handle_request(req, res, next);
    }
  }
};

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 callback functions but got a ' + type;
      throw new TypeError(msg);
    }

    var layer = Layer('/', {}, handle);
    layer.method = undefined;

    this.methods._all = true;
    this.stack.push(layer);
  }

  return this;
};

首先route是作为一个layer对象的一个属性,挂在在layer中的,route本身的结果类似于router,是一个数组,或者说是一个栈。元素的类型是layer。
1.构造函数比较简单,主要是存储路由的路径和分配一个数组存储layer数据结构。methods的存在主要是因为前端请求一个路径,可以对应很多种http方法,比如get,post这种,所以methods变量主要是用在匹配路由时进行筛选时。
2.各种http方法和一个特殊的all方法的逻辑是类似的,主要是根据传进来的0个或者多个回调函数,创建0个或者多个layer层,并且把他们加到route的数组中。
3.dispatch是最重要的函数,这个函数是在路由查找的过程中,匹配到了当前的路由时执行。核心的逻辑在next函数里,并且这个next函数和router里的next是不一样的。代码的第一行先判断执行next的时候,是否传入了route,是的话,就忽略当前栈中还没有执行的函数,跳到下一个路由层。我们可以想象express的整个路由机制有点类似二维数组,比如是5*5的,我们先在一维数组里查找路由(router的逻辑),找到后,假设是第二行,然后我们执行第二行里的所有列对应的函数(route的逻辑)。回到上面,假设是在第二列next到第三列时,执行next的时候传入了route,那么第三列和后面的函数都不会被执行,路由机制会继续从第三行往后找匹配的路径。这里是通过执行done达到这个效果。
路由架构图

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

express框架route.js源码解析 的相关文章

随机推荐

  • 腾讯会议录屏后,忘记转码或转码不成功的补救方法(含详细图例转码示范)。

    一 问题 腾讯会议录屏后文件只能由腾讯会议识别 其他设备打不开 所以需要用腾讯会议转为MP4格式 通过利用历史会议中操作进行手动转码或者是创建一个新的会议模拟还原设备文件 例如无论是哪一个腾讯会议 只需要将其录屏文件 替换为自己想要转换的文
  • Tomcat源码解析(一)下载源码与导入eclipse

    自从写web程序以来 web程序是如何在Tomcat中运行的一直困惑着我 不知道底层的运行机制是无法真正理解web的 所以就开始研究Tomcat源码 Tomcat是一个轻量级的Java服务器 再结合 How Tomcat works 和网上
  • Python实战项目:为人脸照片添加口罩

    前言 好想玩点不一样的 感觉平常的已经不能吸引大家了 想了又想 我今天给大家分享如何给人像添加口罩吧 毕竟最近疫情那么 严重 也只能玩玩这个了 大家千万别乱跑啊 效果展示 数据集展示 数据集来源 使用了开源数据集FaceMask Celeb
  • webpack打包原理

    作者 好奇男孩 链接 https www jianshu com p 37ff752d0f97 来源 简书 1 webpack核心概念 entry 一个可执行模块或库的入口文件 chunk 多个文件组成的一个代码块 例如把一个可执行模块和它
  • 为什么要做期货反向跟单之风控

    反向跟单来自于28定律 138证券市场本身是一个残酷的市场5098 从散户交易者4957的角度上能够看到大多数的交易者都是亏损的 虽然网上统计数据表明82 的交易者都是亏损的 但是具体实际数据应该远高于82 的亏损数量 向跟单思维模式利用的
  • 微服务中什么是熔断?什么是服务降级?

    开始做微服务项目 先回顾回顾基础概念 原文 https www cnblogs com lingboweifu p 11808307 html 服务熔断的作用类似于我们家用的保险丝 当某服务出现不可用或响应超时的情况时 为了防止整个系统出现
  • 天池热身赛-布匹瑕疵目标检测

    1 检测代码 代码源自datawhale官方提供baseline https github com datawhalechina team learning cv tree master DefectDetection baseline使用
  • QEMU模块模型

    QEMU模块模型 define module init function type static void attribute constructor do qemu init function void register module i
  • 用python代码实现输入基金代码爬取季度报告并获取季报特定模块内容制作动态词云图

    本文涉及爬虫 pdf文件转txt文件 提取指定内容和生成词云图四个部分 文章目录 前言 一 引入库 二 爬取网页上的基金季报 三 pdf转txt文件 四 提取指定内容 五 删除页眉页脚 六 制作词云图 总结 前言 本文将介绍如何爬取网站上的
  • 使用Pysot和MATLAB目标跟踪画对比图,标注框

    使用Pysot和MATLAB目标跟踪画对比图 标注框 python画图点会掉 MATLAB点会涨 具体什么原因 我也不知道 最近也是在画图 搞了很久 翻了很多博客 才弄好 哈哈 在很多博客留下了身影 太多人私聊问我怎么画的 就简单写个教程
  • ESXI安装Mikrotik RouterOS(ROS)软路由部署指南(附授权镜像下载)

    一 什么是RouterOS ROS ROS优点与缺点 RouterOS 简称ROS 是一种路由操作系统 基于Linux开发 兼容x86 PC的路由软件 是目前功能较强 应用较广的软路由系统 适用于中小企事业单位 网吧 宾馆和运营商 通过该软
  • warning The transaction log file is corrupted.

    Remark Even if appealing using compress option has a constraint when preparing the backup as clearly stated by Percona B
  • 实现两个路由器漫游(传统路由器做AP)

    如果您有钱 请买300 个以上的路由器 接上之后进入设置页面会显示选择AP模式 你继续就好了 本文针对TP Link一类没有模式选择的 方法大致两种 一 接WAN口 不同网段 开DHCP 1 修改IP地址为不同网段 比如前端路由器的IP地址
  • 【Blender】贝塞尔曲线图形原理和公式推导

    Blender 贝塞尔曲线图形原理和公式推导 什么是贝塞尔曲线 贝塞尔曲线 英文名Bezier Curve 是计算机图形学非常重要的一种曲线 它可以将若干的点 用一条平滑自然的曲线来连接起来 比如我们在地图库中绘制用户行走轨迹时 如果用折线
  • 枚举,联合体,结构体大小计算

    文章目录 前言 一 枚举类型 二 结构体 三 联合体 四 结构体的计算 总结 前言 关于枚举 联合体 结构体自己的理解 以及大小的计算 提示 以下是本篇文章正文内容 下面案例可供参考 一 枚举类型 enum 枚举是一个被命名的整型常数的集合
  • Unity_设置Shader代码默认打开方式

    Browse 浏览路径 找到打开方式
  • 【综合类型第 37 篇】又是一年 1024 程序员节

    这是 综合类型第 37 篇 如果觉得有用的话 欢迎关注专栏 到公司后才发现今天是 1024 程序员节 不过最近比较忙 忘记写博客了 刚下班回到家 最近还是挺累的 不过也快完工了 fighting 今年不知道还能不能拿到勋章了 但今天的博客无
  • C# 字典代替switch case跳转函数

    此方法 仅限于case中的函数 有相同的参数 此方法符合表驱动法思想 Table Driven Methods private delegate void Display string JSON private void button12
  • adb -- no permissions (user in plugdev group; are your udev rules wrong?)解决方案

    Ubuntu adb fastboot 报错提示 no permissions user in plugdev group are your udev rules wrong 解决方案 此处的前提是你已经安装了Android platfor
  • express框架route.js源码解析

    route js并不是express里真正的路由代码 他只是其中的一个组成部分 和router router index js 是有区别的 下面先看一下重要的代码 function Route path this path path thi