express中间件系统的基本实现
一直觉得express
的中间件系统这种流式处理非常形象,就好像加工流水线一样,每个环节都在针对同一个产品的不同部分完成自己的工作,最后得到一个成品。今天就来实现一个简易的【中间件队列】。
一. API层
初始化方法
let middleware = new MiddleWare();
- 添加中间件函数的方法
//Fn为被添加的中间件middleware.use(Fn);
- 启动中间件队列
middleware.start(req, res);
二. 核心类的定义
class MiddleWare{ constructor(){ this.queue = [];//用来存放中间件队列} //添加中间件use(fn){ this.queue.push(fn);//将自定义中间件加入队列} //按次序执行中间件start(req, res){ let i = 0;//执行指针//执行器const next = (err)=>{ //如果有错误就将错误信息挂在response上并直接退出if(err){res.hasError = true;res.data = err.toString(); return;} //如果没有错误就查看是否到达队尾,若没到则继续执行下一个中间件if(i < this.queue.length){ this.queue[i++](req, res, next); /*将next直接传入当前执行的函数作为回调当前执行函数执行到任何一步,通过主动调用next方法即可将相关信息传给下一个中间件。*/}else{ //如果已经到队尾了则结束console.log('finish');}} //启动第一个next();}
}
三. 使用use方法添加中间件
//添加第一个中间件/*
此处演示了一个基本的错误捕捉的写法,当中间件中出现错误时,会捕捉到错误并传入next
*/middleware.use(function(req, res, next){ try{req.addon1 = 'I add something'; }catch(err){next(err);}next();
});//添加第二个中间件middleware.use(function(req, res, next){res.addon2 = 'I add something more';next();
});//添加第三个中间件middleware.use(function(req, res, next){ if (req.addon2) { delete req.addon2;}res.addon3 = 'I add something a lot';next();
});
四. 消费定义的类
“消费”这个词是最近学到的,觉得很装X,所以也在这里装一下~
let req = {};let res = {};let result = middleware.start(req,res);console.log(req, res);
五. 查看运行结果
可以看到有错误发生和正常响应时的不同结果:
六. 在服务器端运行
用node
起一个web服务器那真是太随意了~
const http = require('http');//上面的一堆代码http.createServer(function(req, res){ let result = {};middleware.start(req, result);res.end(JSON.stringify(result));
}).listen(9527);
看一下效果(访问服务器时自定义消息就可以传至前台了):
来源:华为云社区 作者:大史不说话
express中间件系统的基本实现相关推荐
- 【随笔】express中间件系统的基本实现
一直觉得express的中间件系统这种流式处理非常形象,就好像加工流水线一样,每个环节都在针对同一个产品的不同部分完成自己的工作,最后得到一个成品.今天就来实现一个简易的[中间件队列]. 一. API ...
- 【nodejs原理源码赏析(1)】Express中间件系统的基本实现
一直觉得express的中间件系统这种流式处理非常形象,就好像加工流水线一样,每个环节都在针对同一个产品的不同部分完成自己的工作,最后得到一个成品.今天就来实现一个简易的[中间件队列]. 一. API ...
- 二、express中间件
一.中间件引入 实现加入日志模块功能: 1. 我们能想到的方案: 将日志输出代码封装到函数中,然后需要日志输出的地方调用这个函数即可. app.js文件: const express = requir ...
- express中间件和路由教程
一.路由 1.通常HTTP URL的格式是这样的:http://host[:port][path] http表示协议. host表示主机. port为端口,可选字段,不提供时默认为80. path指定 ...
- Node.js b站教学视频汇总笔记(完)CommonJS模块规范、 require、npm、Express(中间件)、MongoDB、MySQL
文章目录 Node.js b站教学视频汇总笔记(完)CommonJS模块规范. require.npm.Express(中间件).MongoDB.MySQL 1. Node介绍 为什么要学习Node. ...
- Express 中间件及路由
通过示例介绍中间件 打印请求日志(输出每个请求的 请求方法 + 请求路径 + 请求时间) app.get('/', (req, res) => {res.send('get /') })app. ...
- 百万并发中间件系统的内核设计看Java并发性能优化
" 这篇文章,给大家聊聊一个百万级并发的中间件系统的内核代码里的锁性能优化. 很多同学都对Java并发编程很感兴趣,学习了很多相关的技术和知识.比如volatile.Atomic.synch ...
- Express中间件工作原理介绍
Express中间件工作原理介绍 中间件是Express框架学习中最难的部分,同时也是最为核心的技术,我们的学习路线如下 1.什么是中间件 2.Express中间件的本质及工作原理 3.自定义解析po ...
- koa2 mysql 中间件_Koa2 和 Express 中间件对比
koa2 中间件 koa2的中间件是通过 async await 实现的,中间件执行顺序是"洋葱圈"模型. 中间件之间通过next函数联系,当一个中间件调用 next() 后,会将 ...
最新文章
- mac bash 下使用vi 快捷方式——因为没有alt键 所以没有办法 用vi模式也非常方便的...
- 今天下棋,结合以前一些技巧的总结
- 软件测试功能测试都有哪一些,【软件测试基础】功能测试常用方法都有哪些
- 6.1 范数最小解,右逆,零空间映射矩阵
- Linux下改动Oracle数据库字符集命令
- Laravel 启动流程分析 (代码全流程)
- drupal_prepare_form 大致是如何工作的 ?
- paip.连接access2003数据库python3.3以及php5对比
- 在计算机网络中软件资源共享是指,在计算机网络中,软件资源共享指的是什么...
- 支付系统中,账户体系的设计与记账处理
- English--动词时态
- 《通信原理》AM/DSBSC/SSB信号的调制与解调仿真
- 苹果开发者账号双重验证忘记密保终极解决办法
- 国务院办公厅:多处强调“电子签名、电子印章、电子合同”的应用
- linux终端设置为中文
- VSCODE 使用One Dark Pro并优化
- EZDML的SQL数据查询功能介绍
- 我们的节日| 包汤圆、猜灯谜,喜迎元宵佳节
- 关于随机数(不重复)
- IpMsg代码分析(二)
热门文章
- mysql case默认_MySQL知识整理10.1—存储过程和函数
- glide加载图片闪烁_html5 canvas绘制图片
- java long的包,long longValue()
- h5列表 php,H5的标签使用详解
- docker管理监控方案
- 性能测试流程与性能测试分析和问题定位分享
- 练习:写一个脚本,完成以下任务
- Git:错误:error:src refspec master does not match any
- Activity-在ListFragment中为ListView增加空白视图
- 萌龙大乱斗 合成表 持续更新