zoukankan      html  css  js  c++  java
  • express的中间件

    中间件 middleware

    一个请求发送到服务器后,它的生命周期是 先收到request(请求),然后服务端处理,处理完了以后发送response(响应)回去

    而这个服务端处理的过程就有文章可做了,想象一下当业务逻辑复杂的时候,为了明确和便于维护,需要把处理的事情分一下,分配成几个部分来做,而每个部分就是一个中间件

    app.use 加载用于处理http请求的middleware(中间件),当一个请求来的时候,会依次被这些 middlewares处理。

    中间件执行的顺序是你定义的顺序

    那中间件到底是个什么东西呢?

    中间件其是一个函数,在响应发送之前对请求进行一些操作

    function middleware(req,res,next){
        // 做该干的事
    
        // 做完后调用下一个函数
        next();
    }
    

    这个函数有些不太一样,它还有一个next参数,而这个next也是一个函数,它表示函数数组中的下一个函数

    那函数数组又是什么呢

    express内部维护一个函数数组,这个函数数组表示在发出响应之前要执行的所有函数,也就是中间件数组

    使用app.use(fn)后,传进来的fn就会被扔到这个数组里,执行完毕后调用next()方法执行函数数组里的下一个函数,如果没有调用next()的话,就不会调用下一个函数了,也就是说调用就会被终止

    express的中间件

    中间件是一个可访问请求对象(req)和响应对象(res)的函数,在 Express 应用的请求-响应循环里,下一个内联的中间件通常用变量 next 表示。中间件的功能包括:

    执行任何代码。

    修改请求和响应对象。

    终结请求-响应循环。

    调用堆栈中的下一个中间件。

    如果当前中间件没有终结请求-响应循环,则必须调用 next() 方法将控制权交给下一个中间件,否则请求就会挂起。使用可选则挂载路径,可在应用级别或路由级别装载中间件。可装载一系列中间件函数,在挂载点创建一个中间件系统栈。

    实现简单的Express中间件

    /**
     * 仿照express实现中间件的功能
     *
     * Created by BadWaka on 2017/3/6.
     */
    
    var http = require('http');
    
    /**
     * 仿express实现中间件机制
     *
     * @return {app}
     */
    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();
        }
    
        /**
         * use方法就是把函数添加到函数数组中
         * @param task
         */
        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);
    

    JS是一门神奇的语言,这里用到了两个闭包,并且给app这个函数添加了一个use方法,函数也是可以有属性的

    原理就是每调用一次use,就把传进来的函数扔到express内部维护的一个函数数组中去

    测试结果:


     
     

    ok,相信对Express中间件的原理已经有所了解了,koa和koa2中间件的原理其实也是一样的



  • 相关阅读:
    Generator函数介绍
    C语言基础三
    C语言基础二
    C语言基础一
    node——路由控制
    Node.js_HTTP模块
    node_Express安装及检验
    conda Pyhon版本切换
    JAVA泛型里面各值代表的意义
    jq实现表格多行列复制
  • 原文地址:https://www.cnblogs.com/gnql/p/10266717.html
Copyright © 2011-2022 走看看