码迷,mamicode.com
首页 > Web开发 > 详细

【前端知识体系-NodeJS相关】浅谈NodeJS中间件

时间:2019-11-27 23:31:39      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:前端知识   let   ret   reg   是什么   模拟   就是   node   ddl   

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

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

技术图片

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

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

2. 函数数组又是什么呢?

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

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

3. 如何实现一个中间件呢?

    function express() {
      // 函数数组用于存放所有的中间件函数
      let fns = [];
      
      let app = function(req, res) {
        let i = 0;
        
        function next() {
          // 取出数组中的下一个函数
          let task = fns[i++];
          // 如果函数存在的u啊
          if (task) {
              // 就先去执行这个用户自定义的函数里面的业务逻辑(每次把当前的next继续向后传递)
              task(req, res, next);
          }
        }
        
        // 用户首次调用的执行第一个
        next();
      }
      
      // 使用use的时候就把用户指定的这个函数放入到一个函数数组里面去
      app.use = function(task) {
        fns.push(task);
      }
      
      return app;
    }

4. 模拟实现一个异步按顺序执行的函数?(面试重点)

    function fn1(next) {
      next();
    }
    
    function fn2(next) {
      next();
    }
    
    function fn3(next) {
      next();
    }
    
    
    // 类似于一个异步的迭代器
    function nextRegister(...tasks) {
      let i = 0;
      
      
      function next() {
        let task = tasks[i];
        if (!task || typeof task !== 'function') {
            return ;
        }
        task(next);
      }
      
      // 第一次调用
      next();
    }
    
    // 开始注册三个异步函数
    nextRegister(fn1, fn2, fn3);

5. 描述一下express或者koa的技术架构?

[!NOTE]
关键在于解释清楚对路由中间件的理解,可以以koa的洋葱模型讲解为例。

技术图片

【前端知识体系-NodeJS相关】浅谈NodeJS中间件

标签:前端知识   let   ret   reg   是什么   模拟   就是   node   ddl   

原文地址:https://www.cnblogs.com/fecommunity/p/11922272.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!