文档章节

Node——express 中间件原理

o
 osc_1ee7cxmx
发布于 2018/08/06 14:53
字数 334
阅读 0
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

  • 基本代码

    function express() {
        var funcs = []; // 待执行的函数数组
        var app = function (req, res) {
            var i = 0;
            function next() {
                var task = funcs[i++]; // 取出函数数组里的下一个函数
                if (!task) { // 如果函数不存在,return
                    return;
                }
                task(req, res, next); // 否则,执行下一个函数
            }
            next();
        }
        app.use = function (task) {
            funcs.push(task);
        }
    
        return app; // 返回实例
    }
    
    // 下面是测试case
    
    var app = express();
    http.createServer(app).listen('3000', function () {
        console.log('listening 3000....');
    });
    
    function middlewareA(req, res, next) {
        console.log('middlewareA before next()');
        next();
        console.log('middlewareA after next()');
    }
    
    function middlewareB(req, res, next) {
        console.log('middlewareB before next()');
        next();
        console.log('middlewareB after next()');
    }
    
    function middlewareC(req, res, next) {
        console.log('middlewareC before next()');
        next();
        console.log('middlewareC after next()');
    }
    
    app.use(middlewareA);
    app.use(middlewareB);
    app.use(middlewareC);
    
    app() //模拟一个http请求
    
  • express() 执行之后返回的是一个函数,函数作为对象也可以拥有属性,所以添加了 use 属性,use 的作用是往函数数组 funcs 中添加回调函数

  • 当我们用 app() 模拟一次 http 请求,程序会走 next(),当我们自定义的中间件中有 next 关键字,之后程序会一直处于递归状态,直到 return 或者执行到函数末尾,然后逐一跳出每层递归函数

  • 这样的递归结构,需要三个东西支撑:req、res、next,因为 req、res 保证了上下文一致,而 next 函数保证了中间件的往下执行

  • 帮助文档:https://www.jianshu.com/p/797a4e38fe77

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

HashMap源码分析

HashMap源码 JDK版本: 1.8 类定义 代码 public class HashMap<K,V> extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable 继承AbstractMap,AbstractMap实现Map 实现Map......

jackmanwu
20分钟前
7
0
聊聊dubbo-go的randomLoadBalance

序 本文主要研究一下dubbo-go的randomLoadBalance randomLoadBalance dubbo-go-v1.4.2/cluster/loadbalance/random.go const (name = "random")func init() {extension.SetLoadbalan......

go4it
22分钟前
11
0
如何使用jQuery更改超链接的href - How to change the href for a hyperlink using jQuery

问题: 如何使用jQuery更改超链接的href? 解决方案: 参考一: https://stackoom.com/question/kkb/如何使用jQuery更改超链接的href 参考二: https://oldbug.net/q/kkb/How-to-change-the...

fyin1314
25分钟前
6
0
Linux中.bashrc与.bash_profile的对比

如果你平时在命令行上花费了大量时间,那么你可能会萌生出希望定制 Shell 环境的想法。今天本文就和大家讲解该如何实现你们的这个想法。其实可以通过创建别名、向环境变量 $PATH 添加新目录或...

良许Linux
36分钟前
7
0
信息系统项目管理师(15)

软件需求分析的目的是对各种需求信息进行分析并抽象描述,为目标系统建立一个概念模型。通过需求分析,可以检测和解决需求之间的冲突;发现系统的边界;并详细描述出系统的需求。 访问控制授...

LitStone
49分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部