【nodejs原理&源码赏析(1)】Express中间件系统的基本实现

大史不说话 发表于 2018/09/20 09:38:59 2018/09/20
【摘要】 一直觉得express的中间件系统这种流式处理非常形象,就好像加工流水线一样,每个环节都在针对同一个产品的不同部分完成自己的工作,最后得到一个成品。今天就来实现一个简易的【中间件队列】。一. API层初始化方法let middleware = new MiddleWare();添加中间件函数的方法//Fn为被添加的中间件middleware.use(Fn);启动中间件队列middleware...

pic0.jpg

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

五. 查看运行结果

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

pic1.PNG

六. 在服务器端运行

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

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

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

pic2.PNG


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。