前置知识
在继续阅读本文之前,您需要具备以下技术储备:
- 熟悉 JavaScript 语言
- 熟悉 GraphQL 开发模式
- 了解 npm 包管理工具
npm 包 graphql-rate-limit 简介
graphql-rate-limit 是一款基于 GraphQL 的限流工具,它可以帮助我们对 GraphQL 接口进行限流控制,防止接口被恶意攻击等。
该工具可以通过对 GraphQL 接口执行速度的计算,确定每个请求应被限制的速度,这样就可以将恶意用户的请求限制到特定速度,避免对服务器造成重大影响。
此外,graphql-rate-limit 还支持一系列高级特性,如多条件限制、限流错误提示等。
安装 graphql-rate-limit
安装该工具的方式非常简单,只需要在项目中执行以下命令即可:
npm install graphql-rate-limit
安装之后,我们需要在 GraphQL 应用中引入该包并使用它进行限流控制。
下面,我们将详细介绍 graphql-rate-limit 的使用方法。
使用 graphql-rate-limit
引入 graphql-rate-limit
将 graphql-rate-limit 引入到您的项目中:
const { createRateLimitDirective } = require('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
函数的第二个参数传入一个回调函数,该回调函数可以处理错误信息并返回客户端得到的错误信息。
例如,下面这个例子中我们对默认信息进行了自定义处理:
const rateLimiterDirective = createRateLimitDirective( options, (o) => { return new Error(`这次请求不符合限制条件,最多只能在 ${o.timeRemaining} 秒后执行`); } );
此时,在客户端发生速率限制时,它将得到您自定义的错误信息,而不是系统内置的错误信息。
结语
本文介绍了 npm 包 graphql-rate-limit 的使用方法,您可以在 GraphQL 的应用中使用它来进行限流控制,避免恶意请求对服务器造成重大影响。如果您需要更多的限流控制选项,可以查看官方文档。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6006733f890c4f7277583631