koa-router 正解

news2024/11/23 20:54:31

Koa-Router

之前分析过 Koa/ Koa-Bodyparser 的源码,今天让我们来分析下koa-router的源码,这个插件其实还是挺重要的。毕竟作为路由,我们还是要知道他的工作原理

这里会重申下 其实我是分析了 koa-router 主干流程。一些小众类的方法并没有看,因为意义不大,基本都用不到,等用到了再去分析不晚。

简单使用

简单列举下 API

const Router = require("koa-router");
const Koa = new require("koa");

const router = new Router();
router.post("/user/login", async function (ctx, next) {
  // todo ..
  await next();
});

router.get("/user/list", async function (ctx, next) {
  // todo ...
  await next();
});

const app = new Koa();

app.use(router.routes()).use(router.allowedMethods());

内容分析

router.post(...) 都做了什么

其实这种动作router.post/ router.get等 做的内容是非常简单的。就是将每个路由,以及中间件 收集起来。 如下图

在这里插入图片描述

但是具体的是如何 进行收集的呢??? 接下来会用绘图的方式 给大家描述下:

在这里插入图片描述

router.routes() 都做了什么

在这个逻辑中做了什么呢??? 大体的逻辑就是通过方法match 依据 stack 以及 path 来判断出合适的 layers。 然后挨个执行

在这里插入图片描述

  • 看如下代码,通过router.match方法获取匹配的到的 layer。

    // matched 结构
    const matched = {
      path: [],
      pathAndMethod: [],
      route: false,
    };
    
    // 如果是第一次的话 一定是ctx.path 表示请求path
    const path = router.opts.routerPath || ctx.routerPath || ctx.path;
    // 此时匹配path  以及method  此时会匹配到 相同的path  以及相同的method
    const matched = router.match(path, ctx.method);
    
  • 使用 reduce 方法将每个中间件函数 串行。 中间会插入自己定义的函数

    layerChain =
      // exclusive === true的话 执行匹配到的最后一个方法  反之 所有的方法
      (router.exclusive ? [mostSpecificLayer] : matchedLayers).reduce(function (
        memo,
        layer
      ) {
        memo.push(function (ctx, next) {
          // 表示前置中间件。 记录一些路由信息
          ctx.captures = layer.captures(path, ctx.captures);
          ctx.params = ctx.request.params = layer.params(
            path,
            ctx.captures,
            ctx.params
          );
          ctx.routerPath = layer.path;
          ctx.routerName = layer.name;
          ctx._matchedRoute = layer.path;
          if (layer.name) {
            ctx._matchedRouteName = layer.name;
          }
    
          return next();
        });
        return memo.concat(layer.stack);
      },
      []);
    
  • 通过koa-compose 来串行执行。

    compose(layerChain)(ctx, next);
    

router.allowedMethods() 都做了什么

这个方法就不做太多的描述了。无非是对特定的返回值做特殊的处理。比如:如果是options请求 应该怎么办呢 等等

QA

  • 问题: 会匹配到多个path,以及多个中间件吗???
  • 解答: 会的。因为path是允许是正则的,所以有可能会出现同一个ctx.path 符合多个router.path的。 同时也会将path对应的中间件函数收集起来。通过compose函数来执行,如果需要执行多个的话,每个中间件中调用next 即可

结论

总体而言koa-router源码还是比较简单的,如果很懂的人可以直接忽略,不是很懂的人可以好好看看。 也可以看 更多的源码解析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/169862.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多步骤复杂 SQL 优化实例

问题先看数据:deliver 表是主表,一个客户会发生多次投递行为:deliverItem 表是从表,一个投递行为有多个投递项,delivered 是投递状态(1 表示未完成,2 表示投递完成):需求…

如何了解一个软件的设计?

刚入职,接手新项目,面对一个全新项目,怎么快速研究它? 很多人直接看源码,一头扎入代码,很快就迷失其中,最初那股子探索精神,也会逐渐被迷茫所替。有多少次你满怀激情打开一个开源项…

极光推送REST API与Java后台对接

极光推送官网的web推送页面 因为是对接它的api,所以我参照这这个样式实现了一个,效果如下: 定时任务推送界面,可定制。实现了推送一次和每日定时推送,如果再扩展的话有每周、每月的功能,只是没有这个业务…

银行数字化转型导师坚鹏:银行数字化转型的五大痛点

首先从汇丰银行业绩持续下滑谈起,汇丰银行作为一家国际知名的全球性银行,最近10年左右的时间里,营业收入持续下降,已经从2008年的1400多亿美元到2021年的804.29亿美元; 净利润徘徊不前,2021年比2020年下降29.2%,仅为52…

kafka心得记录

1.为何引入kafka? 削峰填谷,主要还是为了应对上游瞬时大流量的冲击,避免出现流量毛刺现象,保护下游应用和数据库不被大流量打垮。 2.kafka备份机制,主从机制,Leader-Follower: Kafka 定义了两类副本:领导…

C语言文件操作函数详解——将你的代码永久化 ( •̀ ω •́ )✧

🎄博客主页:🎐大明超听话 🎋欢迎关注:👍点赞🙌关注✍评论 🎍系列专栏:🎑从零开始C语言 🎊从0开始数据结构与算法详解 🎆计算机考研——…

JavaScript中的原型链

本文作者为奇舞团前端开发工程师概述JavaScript 是 Web 的编程语言,简单易学,功能强大,但由于过于灵活设计理念,导致初学者经常一脸懵,本文要谈的是JavaScript中难点之一原型链。原型链的前世JavaScript的诞生要理解Ja…

Nessus介绍与安装

Nessus介绍与安装 1.Nessus简介 Nessus号称是世界上最流行的漏洞扫描程序,全世界有超过75000个组织在使用它。该工具提供完整的电脑漏洞扫描服务,并随时更新其漏洞数据库。Nessus不同于传统的漏洞扫描软件,Nessus可同时在本机或远端上遥控&…

测试开发 | Dubbo 接口测试原理及多种方法实践总结

image1080478 86.9 KB 1、什么是 Dubbo? Dubbo 最开始是应用于淘宝网,由阿里巴巴开源的一款优秀的高性能服务框架,由 Java 开发,后来贡献给了 Apache 开源基金会组织。 下面以官网的一个说明来了解一下架构的演变过程&#xff0…

初学Java中的方法,看这篇就够了

本篇介绍了Java中方法的概念以及方法的使用(方法的定义和调用,实参和形参的关系).方法重载的介绍和使用,编译器如何实现方法重载- -方法签名,介绍和使用方法调用自身解决问题的技巧–递归 对比递归和循环的优缺点 掌握Java中的方法一.方法的概念及使用1.什么是方法2.方法的使用…

【C++】AVL树

​🌠 作者:阿亮joy. 🎆专栏:《吃透西嘎嘎》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉AVL树&am…

【Linux】CentOS、CentOS Stream、RedHat 和Fedora 之间的关系

目录 简单说明 详细说明 红帽(Red Hat)系和德班(Debian)系 简单说明 在centos8之前: Fedora 》RedHat 》CentOS Fedora 是RedHat的“试验场”,很多新功能和特性先加入Fedora 稳定后再加入RedHat&…

YOLOv5 引入 最新 BiFusion Neck | 附详细结构图

YOLO 社区自前两次发布以来一直情绪高涨!随着中国农历新年2023兔年的到来,美团对YOLOv6进行了许多新的网络架构和训练方案改进。此版本标识为 YOLOv6 v3.0。对于性能,YOLOv6-N在COCO数据集上的AP为37.5%,通过NVIDIA Tesla T4 GPU测…

99.恢复二叉搜索树

99.恢复二叉搜索树 1、题目描述 题目的额外要求是: 使用 O(n) 空间复杂度的解法很容易实现。你能想出一个只使用 O(1) 空间的解决方案吗? 2、解题思路 二叉搜索树中某两个节点被交换了数值,那么对中序序列的影响如下: 假设没有交换之前二叉…

活动星投票千人共读一本书网络评选微信的投票方式线上免费投票

“千人共读一本书”网络评选投票_视频投票评选_投票统计小程序_微信不记名投票用户在使用微信投票的时候,需要功能齐全,又快捷方便的投票小程序。而“活动星投票”这款软件使用非常的方便,用户可以随时使用手机微信小程序获得线上投票服务&am…

正则表达式和re模块

目录 一.基础匹配 1.什么是正则表达式 re模块三个基础方法 re.match(匹配规则,被匹配字符串) search(匹配规则,被匹配字符串) findall(匹配规则,被匹配字符串) 小结 二.元字符匹配 单字符匹配: 示例: 数量匹配 边界匹配 分组匹配…

【Java】【系列篇】【Spring源码解析】【三】【体系】【BeanFactory体系】

BeanFactory体系BeanFactory整体结构体系图顶层接口-BeanFactory1.1、描述1.2、方法解析(15个)1.2.1、属性1.2.2、获取bean实例1.2.3、获取bean的提供者(对象工厂)1.2.4、判断是否包含bean1.2.5、单例,原型,bean类型的判断1.2.6、…

SAP ABAP——SAP包(二)【CTS | 传输请求】

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计专业大二本科在读,阿里云社区专家博主,华为云社区云享专家,CSDN SAP应用技术领域新兴创作者。   在学习工…

CentOS7.9配置Nginx反向代理+NodeJS部署上线

Nginx配置 Nginx是一个高性能的HTTP和反向代理服务,许多的大型网站都会采用Nginx来进行HTTP服务器托管 安装编译环境gcc g 进入到root目录: yum -y install make zlib zlib-devel gcc-c libtool openssl openssl-devel 安装PCRE PCRE功能时让Ngi…

ue4c++日记3(碰撞报告碰撞位置|力和扭矩)

目录 代码速查 根据世界方向/局部方向移动 根据世界方向/局部方向旋转 加力加扭矩 1碰撞并报告碰撞位置 两个设为阻挡才会阻挡,其中一个是重叠就会重叠 2例子:旋转前进!/原地踏步? 3增加力和扭矩 1.头文件 2.cpp文件 …