zoukankan      html  css  js  c++  java
  • 【前端知识体系-NodeJS相关】浅谈NodeJS中间件

    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的洋葱模型讲解为例。

    洋葱模型

  • 相关阅读:
    jsp和servlet有什么区别?
    JavaScript中null、undefined有什么区别?
    Java中的信号量Semaphore
    Java中实现线程通信方式有哪些?
    说说对于sychronized同步锁的理解
    线程的run()方法和start()方法有什么区别?
    高并发大型网站架构设计
    高并发高流量网站架构(转)
    构建高并发高可用的电商平台架构实践
    自己搭建CDN服务器静态内容加速-LuManager CDN使用教程
  • 原文地址:https://www.cnblogs.com/fecommunity/p/11922272.html
Copyright © 2011-2022 走看看