Egg - 中间件易错点和洋葱模型

这篇具有很好参考价值的文章主要介绍了Egg - 中间件易错点和洋葱模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. 易错中间件编码

废话不多说,我给大家写个Demo

const auth = () => {
  return async (ctx: Context, next: () => any) => {
	const user = getUser();
    if (user) {
      const {hasPermission} = user;
      // 如果没有权限
      if (!hasPermission) {
        ctx.body = {
          CODE: 'NO_PERMISSION',
        };
      } else{
         await next();
	  }
    }
  };
};

export default auth;

伪代码很简单,意思就是:

  • 如果用户没有权限,返回一个固定的Code
  • 如果有权限则放行。

这段代码从语义上看其实并没有任何问题,用过Egg的小伙伴也知道,ctx.body对象赋值,也相当于给最终返回对象赋值。

但是这个代码却有着很严重的问题,我们先来回顾一下洋葱模型。

1.1 中间件和洋葱模型

解释如下:

  1. Egg.js 中间件的执行顺序是按照洋葱模型来进行的,即请求从外到内依次经过每个中间件,再从内到外依次返回响应结果。
  2. 在这个过程中,每个中间件都需要执行 await next() 将控制权交给下一个中间件或路由处理函数。
  3. 如果某个中间件没有执行 await next(),则会导致请求无法继续往下执行,也就无法返回响应结果。
  4. 因此,如果不执行 await next(),则需要使用 return 明确地结束当前中间件函数的执行,并将控制权交还给上一个中间件或路由处理函数,以保证请求能够正常地继续执行。

我们重点关注最后一句话,就是说,如果你不执行await next(),一定要执行“return” 函数。即使你给ctx.body赋值了也没有用,因为程序它会阻塞。

那么正确的做法就是:

const auth = () => {
  return async (ctx: Context, next: () => any) => {
	const user = getUser();
    if (user) {
      const {hasPermission} = user;
      // 如果没有权限
      if (!hasPermission) {
        ctx.body = {
          CODE: 'NO_PERMISSION',
        };
        return;
      } 
    }
    await next();
  };
};

export default auth;

写中间件的时候,一定要注意这个点:文章来源地址https://www.toymoban.com/news/detail-534217.html

  1. 你的中间件必须有两种返回:要么return,要么await next()

到了这里,关于Egg - 中间件易错点和洋葱模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • scrapy---爬虫中间件和下载中间件

            -进来request对象         -加代理         -加cookie         -加请求头     -出去response对象         -修改响应对象,最后进入到爬虫的parser中就是修改后的response 1.加代理   2.加cookie,修改请求头,随机生成UserAgent         2.1加cookie        2.2 修改请求头

    2024年02月16日
    浏览(66)
  • 常见的中间件以及什么是中间件

    中间件顾名思义就是系统软件和应用软件之间连接的软件,以便于软件各部件之间的沟通,特别是应用软件对于系统软件的集中的逻辑,是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件在客户服务器的操作系统、网络和数

    2024年02月06日
    浏览(63)
  • 探索Scrapy中间件:自定义Selenium中间件实例解析

    Scrapy是一个强大的Python爬虫框架,可用于从网站上抓取数据。本教程将指导你创建自己的Scrapy爬虫。其中,中间件是其重要特性之一,允许开发者在爬取过程中拦截和处理请求与响应,实现个性化的爬虫行为。 本篇博客将深入探讨Scrapy中间件的关键作用,并以一个实例详细介

    2024年02月04日
    浏览(71)
  • 云原生中间件开源现状分析与华为中间件案例解读

    开源中间件在企业分布式架构搭建和服务治理中扮演着重要的角色,尤其是在解决我国网络高并发和业务复杂性问题方面。然而,尽管中间件市场由商业闭源厂商主导,提供了一系列基础中间件和数据类中间件以支持稳定的应用程序运行环境,开源中间件生态却相对分散和薄

    2024年02月02日
    浏览(79)
  • rust actix-web定义中间件(middleware)记录接口耗时(接口耗时中间件和鉴权中间件)

    actix-web的官网关于中间件的介绍如下 https://actix.rs/docs/middleware/ 这里使用的是最新版的actix-web,旧版本的可能接口不太一样 我们添加的中间件能干什么?我们用一段代码来观察一下 下面是官方提供的中间件的定义方式之一,我们可以看到闭包里面有两个参数 req 和 srv 其中

    2024年02月11日
    浏览(46)
  • Django中间件的源码解析流程(上)——中间件载入的前置

    目录 1. ​前言​ 2. 请求的入口 3. 中间件加载的入口 4. 源码中的闭包实现 5. 最后 哈喽,大家好,我是 小K ,今天咋们分享的内容是:在学会Django中间件之后, 我们继续深入底层源码。 在执行中间件时请求到来总是从前往后逐一匹配,但当响应返回时,执行的中间件顺序往往

    2024年04月22日
    浏览(43)
  • 【云计算学习教程】什么是中间件?常见中间件有哪些?

    3)最后 Apache 把这个临时的静态网页文件发给用户。 采用 Perl、Python 和 Ruby 脚本语言编写的动态网页,其工作过程与 PHP 类似。 Apache 是最流行的开源网站服务器,在世界排名前 100 万的网站中,有 60.6% 的网站采用 Apache;在排名前 1000 的大型网站中,Apache 占到了 34.5%,而 N

    2024年04月22日
    浏览(41)
  • 【ASP.NET Core 基础知识】--中间件--什么是中间件

    本篇文章作为中间件单元的开篇文章,通过这篇文章可以了解什么是中间件、内置中间件的使用以及怎么创建自定义中间件。我们先来看一下中间件的角色、目的和重要性。 1. 角色 请求处理管道的构建块: 中间件是构成ASP.NET Core请求处理管道的基本组成部分。每个HTTP请求都

    2024年01月16日
    浏览(65)
  • GoZero微服务个人探究之路(七)添加中间件、自定义中间件

    官方已经自己实现了很多中间件,我们可以方便的直接使用,不用重复造轮子了 开启方式可以看官方文档 中间件 | go-zero Documentation 在业务逻辑中,我们需要实现自定义功能的中间件 ------这里我们以实现跨源访问的中间件(详情可见这篇文章flutter开发web应用网络请求后台失

    2024年01月21日
    浏览(52)
  • 【ASP.NET Core 基础知识】--中间件--创建自定义中间件

    一、为什么需要自定义中间件 自定义中间件在ASP.NET Core中的应用主要有以下几个原因: 满足特定需求: 默认情况下,ASP.NET Core提供了许多内置的中间件来处理常见的任务,如身份验证、授权、静态文件服务等。然而,某些项目可能有特定的需求,需要定制化的处理流程,这

    2024年01月17日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包