GraphQL是一种用于API的查询语言,它提供了客户端与API之间通信的标准化方式。在GraphQL中,客户端可以通过查询来指定需要返回的数据,服务器则会根据这些查询返回相应的结果。然而,GraphQL的查询语句可以变得非常复杂,这会给GraphQL服务器带来很大的负担。这时候,我们就需要一个npm包来限制查询的复杂度。graphql-query-complexity就是这样一个npm包。
graphql-query-complexity可以用来限制客户端发起的查询的复杂性,从而避免GraphQL服务器负载过大。
安装graphql-query-complexity
要使用graphql-query-complexity,首先需要安装它。可以使用npm在命令行中安装。
--- ------- ------------------------ ------
使用示例
接下来,我们继续介绍如何使用graphql-query-complexity。我们将从一个最简单的示例入手。
----- ------- - ------------------- ----- - ----------- - - --------------------------- ----- - ------------ ------ --------- --------------- ------------ - - ------------------- ----- - ------------------------- - - ------------------------------------ ----- ------ - ------------- ---- ----- - ----------- --------- ------- ------ -------- - ---- ---- - --- --- ----- ------- - --- ----- --------- - - ------ -- ---- -- -- ------- ---------- ------ -- -- - - --- -- ----- ------- -- - --- -- ----- ----- -- -- -- ----- --- - ---------- -------- ----------- ------------- ------- ---------- ---------------- - ----------------------------- - ------- ---- -- ------------------ ------- ------ --- ------------------ -- -------------------- ----- -- -- -------- -------------- ----- ---------------- ----- ------ --- -- -- ---------------- -- -- - ---------------------- -- -------------------------------- ---
这个例子告诉我们如何使用graphql-query-complexity来限制GraphQL查询的复杂度。我们首先创建了一个GraphQL模式,它描述了我们的查询端点。然后,我们创建了一个GraphQL服务器,它侦听在http://localhost:4000/graphql
上。我们还设置了一个限制,如果查询复杂度超过10,限制就会触发。
这里我们调用createComplexityLimitRule
来创建一个规则,并将该规则添加到validationRules
数组中。createComplexityLimitRule
的第一个参数是查询的最大复杂度,如果查询的复杂度超过这个值,限制就会被触发。第二个参数是一个选项对象,它接受一个onCost
函数作为回调函数。我们可以在这个回调函数中打印出查询的复杂度。
当我们使用GraphQL客户端发送查询时,服务器将执行查询,并返回结果。如果我们破坏了复杂度限制,服务器将返回一个错误对象。
建议
对于查询规模特别大的项目,建议较小值,如5或7,作为GraphQL查询的最大复杂度。这会在查询性能和服务器负载之间提供平衡。此外建议加上日志系统,以便更好地了解查询复杂度的分布情况,以及识别哪些查询是造成服务器负载高的罪魁祸首。
结语
在GraphQL服务器中使用graphql-query-complexity是一个非常有效的手段,可以避免大量计算量给服务器带来的负担,并提高服务器的响应速度。使用这个npm包还是比较简单的,只需要按照上面的步骤进行配置即可。祝你愉快的GraphQL编程!
来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/5eedae66b5cbfe1ea0610e2e