npm 包 graphql-rate-limit 使用教程

阅读时长 7 分钟读完

前置知识

在继续阅读本文之前,您需要具备以下技术储备:

  1. 熟悉 JavaScript 语言
  2. 熟悉 GraphQL 开发模式
  3. 了解 npm 包管理工具

npm 包 graphql-rate-limit 简介

graphql-rate-limit 是一款基于 GraphQL 的限流工具,它可以帮助我们对 GraphQL 接口进行限流控制,防止接口被恶意攻击等。

该工具可以通过对 GraphQL 接口执行速度的计算,确定每个请求应被限制的速度,这样就可以将恶意用户的请求限制到特定速度,避免对服务器造成重大影响。

此外,graphql-rate-limit 还支持一系列高级特性,如多条件限制、限流错误提示等。

安装 graphql-rate-limit

安装该工具的方式非常简单,只需要在项目中执行以下命令即可:

安装之后,我们需要在 GraphQL 应用中引入该包并使用它进行限流控制。

下面,我们将详细介绍 graphql-rate-limit 的使用方法。

使用 graphql-rate-limit

引入 graphql-rate-limit

将 graphql-rate-limit 引入到您的项目中:

如果您使用了 Apollo Server,则可以直接将 createRateLimitDirective 作为参数传入 ApolloServer 的配置中。

创建限速指令

创建一个 @rateLimit 指令,它可以用来标记需要进行限速的 GraphQL 操作。这个指令的应用方法和 GraphQL 中的其他指令一样,您可以将它作为注释加入到操作的定义中。

-- -------------------- ---- -------
----- - --- - - -------------------------
----- -------- - ----
  ---- ---- -
    --- ---
    ----- -------
  -
  ---- ----- -
    --- ----- ----------------- -- --------- ---
  -
--

在这个例子中,我们将 @rateLimit 指令添加到了 me 操作上,这将使得该操作在每 15 秒内最多只能被调用一次。

配置限速选项

createRateLimitDirective 中,您可以配置多种限速选项,例如:

-- -------------------- ---- -------
----- -------------------------- - ----
  --------- -----------
    ---- ---
    ------- ------
    -------- ------
    ------------- --------
    ----------------- ------
    ------- -------
  - -- ----------------
--

----- - ----------------- - - ---------------------------------

-- ------ - ---- ------- ------ --------
----- ------- - --- -------------------
  ------- --
  --------- ---
---

----- -------------------- - --------------------------
  ---------------- ----- -- ---------------
  ------------ ------- -- -
    ------ -
      -------- --------------
      ----------- -
        ----- ---------------
        -------- --------------
        -------------- --------------------
      --
    --
  --
  --------
---

-- --- --- --------- --------- -- ---- ------- ------
----- ------ - --- --------------
  --------- ---------- ----------------------------
  ----------------- -
    ---------- ---------------------
  --
  -------- -- --- -- -- --
    -------- ----
  ---
---

上面这段例子中,我们使用 RateLimiterMemory 创建了一个限流器实例,并且使用一个自定义的 identifyContext 下钻到了请求的 context 中,以根据请求的信息进行限流。

除此之外,还有其他参数可以被用于控制限速,它们的详细说明可以在官方文档中找到。

限制请求速度

在 GraphQL 中,每个请求都可以包含多个操作,并且每个操作定义都可以被 @rateLimit 指令所注释。

在执行 GraphQL 操作之前,会先对该操作的速度进行计算,如果该速度超出了指定的限制范围,则不会执行该操作。

下面,我们来看一个例子,在这个例子中,我们定义了一个名为 slow 的 GraphQL 操作,这个操作的执行速度很慢,但我们设置了 @rateLimit 指令,以使得它每 5 分钟只能执行一次:

-- -------------------- ---- -------
----- - ---------- --------------- - - ------------------------------

-- -----
----- ----------- - -
  ---------------- --------- -- ---------------
  ---------------- ----- ---- ----- -- -
    ---------------- --- --------- --- ---- ---------
  --
  ---- -- -- --------
  --------- ------ -- --------
--
--------
  -----------
  -------------
    -------
    --------- -----
    ---------------- ------------------
    ------------ -------- --------- --------- -- -
      ------ -
        ---------- -----------
          -------
          --------
          ---------
          ----------
          ---------------
        ---
      --
    --
  --
--

自定义限速错误

如果您希望在限速出现错误时返回自定义的错误信息,那么您可以为 createRateLimitDirective 函数的第二个参数传入一个回调函数,该回调函数可以处理错误信息并返回客户端得到的错误信息。

例如,下面这个例子中我们对默认信息进行了自定义处理:

此时,在客户端发生速率限制时,它将得到您自定义的错误信息,而不是系统内置的错误信息。

结语

本文介绍了 npm 包 graphql-rate-limit 的使用方法,您可以在 GraphQL 的应用中使用它来进行限流控制,避免恶意请求对服务器造成重大影响。如果您需要更多的限流控制选项,可以查看官方文档。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6006733f890c4f7277583631

纠错
反馈