express初识源码-Router,Layer,Route

express提供丰富的http工具,快速处理请求,响应。核心功能中间件,路由,基于三个类来实现,Router,Layer,Route。

1.Router

主要核心内容:

  • stack数组存放子路由,中间件。
  • handle方法,循环stack数组,根据规则执行响应回调函数。

一般添加一个路由会这样写代码:

	app.get('/list', function (req, res) {
		res.end('hello express');
	});
复制代码

在Router里面做了一件事来支持这样的写法:


	var methods = require('methods');  //包含http的方法名
	
	methods.forEach((methods) => {
		//拿到具体一个方法名 methods
		Router.prototype[methods] = function() {
			// 调用route方法往stack里面push一个路由
		}
	})
复制代码

express中路由和中间件都是放在了stack数组里面,那么就有顺序问题,如果use一个中间件那么需要放在路由前面。

	const express = require('express');
	const app = new express();
	
	app.use((req, res, next) => {
	    console.log('111');
	    next();
	});
	
	app.get('/list',(req, res) => {
	    res.end('hello express');  
	});
	
	app.listen('8000');
复制代码

next表示通过,可以执行下个中间件或路由,如果发生错误,则可以抛出错误,交给错误中间件处理,错误中间件接受4个参数,4个参数的use就代表了错误中间件.第一个参数为错误信息

	app.use((req, res, next) => {
	    console.log('111');
	    next(new Error('error'));
	});
	
	app.use((error, req, res, next) => {
	    console.log(error);
	})
复制代码

当请求来时,会执行handle,循环stack,发现path相同,method相同,那么调用对应callback。这样处理,带来了一个问题,如果路由不断增多,stack数组会不断增大,匹配效率下降,为了提高效率,express引入了route,layer.

2.Layer

把同一个path形成一层,并提供match方法进行匹配判断,handle方法来执行当前层的深入匹配methods。

简单理解就是匹配一个路径,然后执行回调方法。

那么当一个路由注册的时候,则新生成一个Layer实例,如果剩下还有路由路径相同,则放在该层。怎么去放入这层的,在Route做。

3.Route

Layer形成了层,但没有做匹配methods的事情,那么这个事情由Route来做。在Layer里面会传入一个handle方法,那么这个handle方式就是Route里面的dipatch方法,当Layer的路径已经匹配成功,就会交给Route来匹配method,Route的对象存放所有注册的方法名,用于快速匹配是否有注册该方法,在Route里面又复用了Layer,去执行真正回调处理函数。

4.实现高效率匹配

	app.route('/list').get((req, res) => {
		res.end('hello get');  
	}).post((req, res) => {
		res.end('hello post');  
	}).put((req, res) => {
		res.end('hello put');
	}).delete((req, res) => {
		res.end('hello delete');
	});
复制代码

下面看一个伪代码,看如何去实现的app.route方法:

	app.route = function(path) {
		const route = new Route(path); // 生成一个route实例
		const Layer = new Layer(path, route.dispatch.bind(route)); // 把route里面的dispatch方法作为Layer的处理函数
		
		this.stack.push(layer); // 放入数组中
		
		return route; // 返回route实例,用于链式调用,去注册method方法
	}
复制代码
Linux创始人LinusTorvalds有一句名言:Talk is cheap, Show me the code.(冗谈不够,放码过来!)。 代码阅读是从入门到提高的必由之路。尤其对深度学习,许多框架隐藏了神经网络底层的实现,只能在上层调包使用,对其内部原理很难认识清晰,不利于进一步优化和创新。  YOLOv3是一种基于深度学习的端到端实时目标检测方法,以速度快见长。YOLOv3的实现Darknet是使用C语言开发的轻型开源深度学习框架,依赖少,可移植性好,可以作为很好的代码阅读案例,让我们深入探究其实现原理。  本课程将解析YOLOv3的实现原理和源码,具体内容包括: YOLO目标检测原理  神经网络及Darknet的C语言实现,尤其是反向传播的梯度求解和误差计算 代码阅读工具及方法 深度学习计算的利器:BLAS和GEMM GPU的CUDA编程方法及在Darknet的应用 YOLOv3的程序流程及各层的源码解析本课程将提供注释后的Darknet的源码程序文件。  除本课程《YOLOv3目标检测:原理与源码解析》外,本人推出了有关YOLOv3目标检测的系列课程,包括:   《YOLOv3目标检测实战:训练自己的数据集》  《YOLOv3目标检测实战:交通标志识别》  《YOLOv3目标检测:原理与源码解析》  《YOLOv3目标检测:网络模型改进方法》 建议先学习课程《YOLOv3目标检测实战:训练自己的数据集》或课程《YOLOv3目标检测实战:交通标志识别》,对YOLOv3的使用方法了解以后再学习本课程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值