• 全栈项目|小书架|服务器开发-Koa2中间件机制洋葱模型了解一下


    KOA2

    是什么?

    Koa是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。

    为什么产生?

    笔者对这几个框架都不熟,这里就不误人子弟了。可以看看下面一些大佬的介绍。

    Koa是由Express的原班人马打造,那么他们为什么不将Express升级版本呢而是从新开发新的一个项目?看官方的介绍:Koa 与 Express

    中间件

    中间件(英语:Middleware),又译中间件、中介层,是提供系统软件和应用软件之间连接的软件,以便于软件各部件之间的沟通,特别是应用软件对于系统软件的集中的逻辑,在现代信息技术应用框架如Web服务、面向服务的体系结构等中应用比较广泛。中间件-维基百科

    中间件只是一种服务,没有这种服务系统也能够存在。比如:一台台式机,是由很多个部件组装而成。鼠标、键盘等只是为了让系统更加完善。即使没有鼠标或者键盘,台式机也可以使用其他硬件软件来操作电脑。或者查看 AOP 面向切面编程 中的比喻。

    非常有用的Koa中间件合集

    Koa 是一个中间件框架,可以采用两种不同的方法来实现中间件:

    • async function
    • common function

    以下是使用两种不同方法实现一个日志中间件的示例:

    中间件通常带有两个参数(ctx, next), ctx是一个请求的上下文(context),
    next 是调用执行下游中间件的函数. 在代码执行完成后通过 then 方法返回一个 Promise。关于Promise介绍可以查看这篇文章: Promise原理讲解 && 实现一个Promise对象 (遵循Promise/A+规范)

    async functions (node v7.6+)

    app.use(async (ctx, next) => {
      const start = Date.now();
      await next();
      const ms = Date.now() - start;
      console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
    });
    

    Common function

    app.use((ctx, next) => {
      const start = Date.now();
      return next().then(() => {
        const ms = Date.now() - start;
        console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
      });
    });
    

    Koa 的中间件机制使用的是洋葱模型,而什么是洋葱模型呢?

    洋葱模型

    通过 next() 把多个中间件串联执行的效果。所有的中间件都会执行两边,就像洋葱一样,从洋葱的一侧进入就会从另一侧出去。

    洋葱圈模型图示1来源
    洋葱模型图示1
    就是从请求到响应的过程所有的中间件都会走两遍。看不太清楚的可以看图示2。
    洋葱圈模型图示2 来源
    洋葱模型图示2
    通过图示可能还不是很清楚Koa洋葱模型的执行过程,下面来看一个简单例子:

    const Koa = require('koa');
    
    const app = new Koa();
    
    // 中间件1
    app.use(async (ctx, next)=>{
        console.log(1)
        next()
        console.log(11)
    });
    // 中间件2
    app.use(async (ctx, next) => {
        console.log(2)
        next()
        console.log(22)
    })
    
    // 中间件3
    app.use(async (ctx, next) => {
        console.log(3)
        next()
        console.log(33)
    })
    
    app.listen('3000');
    console.log(`http://localhost:3000`);
    

    在浏览器输入http://localhost:3000回车之后的输出结果:

    http://localhost:3000
    1
    2 
    3 
    33
    22
    11
    
    

    通过结果可以看出执行过程和洋葱模型是一致的。

    参考


    咨询请加微信:轻撩即可。
    在这里插入图片描述

  • 相关阅读:
    python初级入门篇
    ADO.NET中DbConnection.GetSchema方法的使用总结
    连接Git@OSC操作步骤
    win7 免安装MariaDB
    Java Web入门学习(二) Eclipse的配置
    PowerDesigner16 生成的备注脚本,在sql server 2008 中报“对象名 'sysproperties' 无效”的错误的解决办法
    Java Web入门学习(一) STS与Tomcat配置
    ECharts-入门学习
    xampp使用技巧及问题汇总
    Spring boot注解
  • 原文地址:https://www.cnblogs.com/gdragon/p/11875839.html
Copyright © 2020-2023  润新知