您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    深化浅出Nodejs中间件原理
    时间:2021-08-10 21:07 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    中间件是介于运用系统和系统软件之间的一类软件,它运用系统软件所提供的基础效劳(功用),衔接网络上运用系统的各个部分或不同的运用,可以到达资源共享、功用共享的目的。

    深化浅出Nodejs中间件原理

    在NodeJS中,中间件主要是指封装http央求细节处置的办法。我们都知道在http央求中往往会触及很多举措, 如下: IP挑选 查询字符串传递 央求体解析 cookie信息处置 权限校验 日志记载 会话管理中间件(session) gzip紧缩中间件(如compress) * 错误处置

    当然还有很多自定义的处置举措. 关于Web运用而言,我们并不希望了解每一个细节性的处置任务,而是希望可以把主要精神集中在业务的开发上,以到达提升开发效率的目的, 所以引入了Node中间件来简化和封装这些基础逻辑处置细节.

    node中间件本质上就是在进入详细的业务处置之前,先让特定过滤器处置。如下图所示:

    深化浅出Nodejs中间件原理

    我们目前看到的主流nodejs框架, 比如connect, koa, express, egg, nest等, 都离不开中间件的设计概念, 所以为了能让大家更深化的窥探nodejs世界, 我们就十分有比较研讨中间件的完成原理.

    注释

    在了解node中间件的概念之后, 我们就来手动完成一下中间件, 最后我们会复杂剖析一下koa中中间件的完成思绪. 文章纲要如下: node中间件中心原理完成 koa中间键完成方式 * 应用koa中间件机制完成一个本人的koa中间件

    node中间件中心原理完成

    由上文引见可知中间件是从http央求末尾到照应完毕进程中的处置逻辑,通常需求对央求和照应停止处置. 我们在完成node中间件形式时还需求思索的一个成绩就是多中间件共存的成绩, 我们要思索如何将多个中间件的执行自动化, 不然在央求到照应的进程中只会执行最末尾的中间件, 所以我们基本的中间件方式如下:

    const middleware = (req, res, next) => { 

      // 央求处置逻辑 

      next() 

    接上去我们先写个复杂的案例来看看中间件是如何完成的.

    // 定义几个中间间函数 

    const m1 = (req, res, next) => { 

      console.log('m1 run'

      next() 

     

    const m2 = (req, res, next) => { 

      console.log('m2 run'

      next() 

     

    const m3 = (req, res, next) => { 

      console.log('m3 run'

      next() 

     

    // 中间件集合 

    const middlewares = [m1, m2, m3] 

     

    function useApp (req, res) { 

      const next = () => { 

        // 获取第一个中间件 

        const middleware = middlewares.shift() 

        if (middleware) { 

          middleware(req, res, next

        } 

      } 

      next() 

     

    // 第一次央求流进入 

    useApp() 

    由以上代码我们就不难发现next的作用了, 也就是完成自动调用中间件链的关键参数. 打印结果如下:

    m1 run 

    m2 run 

    m3 run 

    以上即完成了基本中间件的执行形式, 但是我们还需求思索异步的成绩, 假设中间件还依赖第三发模块或许api的支持, 比如验证, 辨认等效劳, 我们需求在该异步中间件的回调里执行next, 才能保证正常的调用执行顺序, 如下代码所示:

    const m2 = (req, res, next) => { 

      fetch('/xxxxx').then(res => { 

        next() 

      }) 

    还有一种中间件场景, 比如说日志中间件, 央求监控中间件, 它们会在业务处置前和处置后都会执行相关逻辑, 这个时分就要求我们需求能对next函数停止二次处置, 我们可以将next的前往值包装成promise, 使得其在业务处置完成之后经过then回调来继续处置中间件逻辑. 如下所示:

    function useApp (req, res) { 

      const next = () => { 

        const middleware = middlewares.shift() 

        if (middleware) { 

          // 将前往值包装为Promise对象 

          return Promise.resolve(middleware(req, res, next)) 

        }else { 

          return Promise.resolve("end"

        } 

      } 

      next() 

    此时我们就能运用如下方式调用了:

    const m1 = (req, res, next) => { 

      console.log('m1 start'

      return next().then(() => { 

        console.log('m1 end'

      }) 

    以上我们就完成了一个基本可以的中间件设计形式, 当然我们也可以用async和await完成, 写法会更优雅和复杂. 笔者这里上一份复杂的例子:

    const m1 = async (req, res, next) => { 

        // something... 

        let result = await next(); 

      } 

     

      const m2 = async (req, res, next) => { 

        // something... 

        let result = await next(); 

      } 

      const m3 = async (req, res, next) => { 

        // something... 

        let result = await next(); 

        return result; 

      } 

     

    const middlewares = [m1, m2, m3]; 

     

    function useApp (req, res) { 

        const next = () => { 

          const middleware = middlewares.shift() 

          if (middleware) { 

            return Promise.resolve(middleware(req, res, next)) 

          }else { 

            return Promise.resolve("end"

          } 

        } 

        next() 

      } 

    // 启动中间件 

    useApp() 

    (责任编辑:admin)