当前位置: 首页 > news >正文

express中间件系统的基本实现

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

一直觉得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);

五. 查看运行结果

可以看到有错误发生和正常响应时的不同结果:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

六. 在服务器端运行

node起一个web服务器那真是太随意了~

const http = require('http');
//上面的一堆代码
http.createServer(function(req, res){
    let result = {};
    middleware.start(req, result);
    res.end(JSON.stringify(result));
}).listen(9527);

看一下效果(访问服务器时自定义消息就可以传至前台了):

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

转载于:https://www.cnblogs.com/dashnowords/p/9683361.html

相关文章:

  • iOS开发 适配iPhoneX/iPhoneXr/iPhoneXs/iPhonexs max
  • 互融云采购招标供应链系统:为供应链行业创造良好环境
  • 第一次作业
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • 大数据
  • TitleBar 的那些设置
  • FR 在数据库查询中使用模板参数
  • 07-文本属性和字体属性,超链接导航栏案例,background,
  • python数据结构转换格式化
  • 服务器连接不成功测试办法
  • 英语发音规则---N字母
  • python深坑集锦 -- super
  • 反客为主 ,Linux 成为微软 Azure 上最流行的操作系统
  • Linux下面如何运行.sh文件
  • windows下 python中报错ImportError: No module named 'requests'
  • 时间复杂度分析经典问题——最大子序列和
  • Apache Zeppelin在Apache Trafodion上的可视化
  • export和import的用法总结
  • JS字符串转数字方法总结
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • markdown编辑器简评
  • Promise面试题,控制异步流程
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • WebSocket使用
  • 7行Python代码的人脸识别
  • MyCAT水平分库
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​VRRP 虚拟路由冗余协议(华为)
  • ![CDATA[ ]] 是什么东东
  • ###C语言程序设计-----C语言学习(3)#
  • $.each()与$(selector).each()
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • ()、[]、{}、(())、[[]]命令替换
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (3)STL算法之搜索
  • (6)STL算法之转换
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (论文阅读11/100)Fast R-CNN
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)创业的注意事项
  • (转)关于pipe()的详细解析
  • (转)项目管理杂谈-我所期望的新人
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET CORE Aws S3 使用
  • .net core控制台应用程序初识
  • .net refrector
  • .netcore 获取appsettings