Express框架实现原理

一、Express 源码的目录结构

在这里插入图片描述
首先,会去package.json项目(包)描述文件中寻找main属性的值,
main:入口文件。这个main的值就是入口文件所在的路径。
在这里插入图片描述

这里并没有配置main属性的值,默认会去找index.js文件作为入口文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

二、快速体验

在这里插入图片描述
在这里插入图片描述

const http = require('http')
const url = require('url')
const routes = [/*{ path: '', method: '', handler: () => {} }*/]
function createApplication() {return {get (path, handler) {routes.push({path,method: 'get',handler})},listen (...args) {const server = http.createServer((req, res) => {const { pathname } = url.parse(req.url)const method = req.method.toLowerCase()const route = routes.find(route => route.path === pathname && route.method === method)if (route) {return route.handler(req, res)}res.end('404 Not Found.')})server.listen(...args)}}
}
module.exports = createApplication

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、抽取App模块

在这里插入图片描述

在这里插入图片描述

const http = require('http')
const url = require('url')
function App() {this.routes = []
}
// const routes = [/*{ path: '', method: '', handler: () => {} }*/]
App.prototype.get = function (path, handler) {this.routes.push({path,method: 'get',handler})
}
App.prototype.listen = function (...args) {const server = http.createServer((req, res) => {const {pathname} = url.parse(req.url)const method = req.method.toLowerCase()const route = this.routes.find(route => route.path === pathname && route.method === method)if (route) {return route.handler(req, res)}res.end('404 Not Found.')})server.listen(...args)}
module.exports = App

四、提取路由模块

在这里插入图片描述

const url = require('url')let Router = function Router() {this.stack = []
}Router.prototype.get = function(path, handler){this.stack.push({path,method: 'get',handler})
}
Router.prototype.handle = function(req, res){const {pathname} = url.parse(req.url)const method = req.method.toLowerCase()const route = this.stack.find(route => route.path === pathname && route.method === method)if (route) {return route.handler(req, res)}res.end('404 Not Found.')
}
module.exports = Router

在这里插入图片描述

const http = require('http')
const Router = require('./router/index.js')
let App = function App() {this._router = new Router()
}
// 把路由收集起来
App.prototype.get = function (path, handler) {this._router.get(path, handler)
}
App.prototype.listen = function (...args) {const server = http.createServer((req, res) => {this._router.handle(req, res)})server.listen(...args)
}
module.exports = App

五、处理不同的请求方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、更强大的路由路径匹配模式(基本实现)

在这里插入图片描述
在这里插入图片描述

const url = require('url')
const methods = require('methods')
const pathRegexp = require('path-to-regexp')
let Router = function Router() {this.stack = []
}
methods.forEach(method => {// Router.prototype.get = function(path, handler){Router.prototype[method] = function(path, handler){this.stack.push({path,method,handler})}
})
Router.prototype.handle = function(req, res){const {pathname} = url.parse(req.url)const method = req.method.toLowerCase()const route = this.stack.find(route => {const keys = []const regexp = pathRegexp(route.path, keys, {})const match = regexp.exec(pathname)return match && route.method === method})if (route) {return route.handler(req, res)}res.end('404 Not Found.')
}
module.exports = Router

七、处理动态路由路径参数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

const url = require('url')
const methods = require('methods')
const pathRegexp = require('path-to-regexp')
let Router = function Router() {this.stack = []
}
methods.forEach(method => {// Router.prototype.get = function(path, handler){Router.prototype[method] = function(path, handler){this.stack.push({path,method,handler})}
})
Router.prototype.handle = function(req, res){const {pathname} = url.parse(req.url)const method = req.method.toLowerCase()const route = this.stack.find(route => {const keys = []const regexp = pathRegexp(route.path, keys, {})const match = regexp.exec(pathname)console.log('keys=>', keys)console.log('match=>', match)if (match) {req.params = req.params || {}keys.forEach((key, index) => {req.params[key.name] = match[index + 1]})}return match && route.method === method})if (route) {return route.handler(req, res)}res.end('404 Not Found.')
}
module.exports = Router

八、提取Layer处理模块

在这里插入图片描述
在这里插入图片描述

const url = require('url')
const methods = require('methods')
const Layer = require('./layer.js')
let Router = function Router() {this.stack = []
}
methods.forEach(method => {// Router.prototype.get = function(path, handler){Router.prototype[method] = function(path, handler){const layer = new Layer(path ,handler)layer.method = methodthis.stack.push(layer)}
})
Router.prototype.handle = function(req, res){const {pathname} = url.parse(req.url)const method = req.method.toLowerCase()const route = this.stack.find(layer => {const match = layer.match(pathname)if(match) {req.params = req.params || {}Object.assign(req.params, layer.params)}return match && layer.method === method})if (route) {return route.handler(req, res)}res.end('404 Not Found.')
}
module.exports = Router

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Java中的流程控制语句

if语句 if语句 : if(条件表达式){ 执行语句; } if..else语句:       if(条件表达式){ 执行语句; }else{ 执行语句; } if..else if..else语句 :…

nginx集群_使用Nginx+Tomcat+keepalived 搭建高性能高可用性负载均衡集群

在互联网项目中,往往面临着高用户量、高并发的问题,造成服务器的压力非常大,特别是电商项目,以淘宝天猫为例,近年双十一的成交量屡创新高,可想而知淘宝天猫的服务器面临的并发量有多大,单一服务…

Nodejs之http模块详解

一、Web服务器 什么是Web服务器? 当应用程序(客户端)需要某一个资源时,可以向一个台服务器,通过Http请求获取到这个资源;提供资源的这个服务器,就是一个Web服务器; 目前有很多开源…

python 16bit转8bit的工具_利用python读取YUV文件 转RGB 8bit/10bit通用

注:本文所指的YUV均为YUV420中的I420格式(最常见的一种),其他格式不能用以下的代码。位深为8bit时,每个像素占用1字节,对应文件指针的fp.read(1);位深为10bit时,每个像素占用2字节,对应文件指针…

linux的几个文本内容查看命令小结

1cat可以查看文本内容,tac就是反向查看文本内容,但是文本内容多了就全部显示不出来 2nl查看文本内容可以显示行号 3more翻页查看以及less翻页查看 more filename 按键使用: enter一行一行的查看 空格键 向下翻页查看 b或者Ctrl b向上翻页 f或…

iOS开源照片浏览器框架SGPhotoBrowser的设计与实现

简介 近日在制作一个开源加密相册时附带着设计了一个照片浏览器,在进一步优化后发布到了GitHub供大家使用,该框架虽然没有MWPhotoBrowser那么强大,但是使用起来更为方便,操作更符合常规相册习惯,自定义和修改源码也十分…

python公式计算器_Python-计算器

#计算器开发需求##1、实现加减乘除及拓号优先级解析#2、用户输入 1 - 2 * ( (60-30 (-40/5) * (9-2*5/3 7 /3*99/4*2998 10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,#必须自己解析里面的(),,-,*,/符号和公式,运算后得出结果,结果必须…

网络流-SAP算法模板

node 表示当前讨论到的节点; flow 表示该节点被传入/要传出的流量;s, t, ver 分别是起点,终点,节点总数; SAP 函数返回增广路成功增大的流量; dlt 是当前已传出的流量; c 是残量。 1 const int …

python bp神经网络分类预测结果图_深度学习入门(四)BP神经网络——数字分类...

采用的是python中机器学习库sklearn图片数据sklearn简要介绍:#sklearn是Python中的一个机器学习包from sklearn.datasets import load_digits #载入Sklearnimport pylab as pldigitsload_digits()#载入数据集(都是数字图片)print(digits.data.shape)#一共有1797张图…

Koa框架

一、认识Koa 前面我们已经学习了express,另外一个非常流行的Node Web服务器框架就是Koa。 Koa官方的介绍: koa:next generation web framework for node.js;koa:node.js的下一代web框架; 事实上&#x…

SPOJ GSS2 Can you answer these queries II (线段树离线) - xgtao -

Can you answer these queries II 这是一道线段树的题目&#xff0c;维护历史版本&#xff0c;给出N(<100000)个数字(-100000<x<100000),要求求出在[l,r]区间里面的连续序列的最大值&#xff0c;并且重复的数字可以加入序列但是值不能再计算。 本题明显使用线段树,它只…

Node使用MySQL

一、认识mysql2 如何可以在Node的代码中执行SQL语句来&#xff0c;这里我们可以借助于两个库&#xff1a; mysql&#xff1a;最早的Node连接MySQL的数据库驱动&#xff1b;mysql2&#xff1a;在mysql的基础之上&#xff0c;进行了很多的优化、改进&#xff1b;目前相对来说&a…

java安装后在哪里打开_冷却塔声屏障安装后降噪效果不理想,原因出在哪里?...

现有冷却塔大部分产品都不能满足噪音环保标准&#xff0c;只有少数几种低吨位超低噪声型号的冷却塔可以满足少部分区域噪声标准要求。在一些商住混合区&#xff0c;冷却塔的出风口强烈的噪声和热气往往干扰附近居民不得安宁&#xff0c;所以冷却塔的噪声问题成为环境投诉的热点…

iOS10 权限崩溃问题

iOS10 权限崩溃问题 原文: http://blog.csdn.net/runleelrg/article/details/51673025 今天 手机升级了 iOS10 Beta&#xff0c;然后用正在开发的项目 装了个ipa包&#xff0c;发现点击有关 权限访问 直接Crash了&#xff0c;并在控制台输出了一些信息&#xff1a; This app h…

Koa框架——coderhub实战

https://github.com/zep03/koa-coderhub/commits/main 一、coderhub功能接口说明 Coderhub旨在创建一个程序员分享生活动态的平台。 完整的项目接口包括&#xff1a; 面向用户的业务接口&#xff1b;面向企业或者内部的后台管理接口&#xff1b; 完成的功能如下&#xff1a;…

python 协程_Python多任务协程

协程协程&#xff0c;又称微线程&#xff0c;纤程。英文名Coroutine。协程是python个中另外一种实现多任务的方式&#xff0c;只不过比线程更小占用更小执行单元(理解为需要的资源)。为啥说它是一个执行单元&#xff0c;因为它自带CPU上下文。这样只要在合适的时机&#xff0c;…

python局域网大文件_[源码]Python简易http服务器(内网渗透大文件传输含下载命令)...

Python简易http服务器源码import SimpleHTTPServerimport SocketServerimport sysPORT 80if len(sys.argv) ! 2:print("use: web.exe port")else:PORT int(sys.argv[1])Handler SimpleHTTPServer.SimpleHTTPRequestHandlerhttpd SocketServer.TCPServer(("&…

CoderHub接口文档

CoderHub接口文档 Coderhub旨在创建一个程序员分享生活动态的平台。 完成的功能如下&#xff1a; 用户管理系统 内容管理系统 内容评论管理 内容标签管理 文件管理系统 接口完整请求示例&#xff1a;http://127.0.0.1:8000/users github仓库&#xff1a;https://github.com…

Spring 概况

网站&#xff1a;http://spring.io/ http://projects.spring.io/spring-framework Spring是一个开源框架&#xff0c;为了解决企业应用开发的复杂性而创建的&#xff0c;但现在已经不止应用于企业应用。 是一个轻量级的控制反转&#xff08;IoC&#xff09;和面向切面&#xff…

属于python应用领域的有数据可视化_Python数据可视化

译者序前 言第1章 数据可视化概念框架11.1 数据、信息、知识和观点21.1.1 数据21.1.2 信息21.1.3 知识31.1.4 数据分析和观点31.2 数据转换41.2.1 数据转换为信息41.2.2 信息转换为知识71.2.3 知识转换为观点71.3 数据可视化历史81.4 可视化如何帮助决策101.4.1 …