随着 GraphQL 在前端应用中的广泛使用,越来越多的开发者开始使用 GraphQL 服务来获取数据。同时,为了优化性能,GraphQL 服务通常会提供 batch 查询,即将多个查询合并为单个请求并返回结果。
然而,与此同时,处理 batch 查询也变得更加复杂,需要使用更多的代码来处理请求和响应。若你使用 Node.js 开发 GraphQL 服务端,那么 npm 包 graphql-batching-helpers
可以为你提供一组方便的工具函数来处理 batch 查询。在本篇文章中,我们将详细介绍这个 npm 包的使用方法。
安装
你可以在你的项目目录中使用以下命令来安装 graphql-batching-helpers
:
npm install graphql-batching-helpers
然后在你的服务端代码中引入模块:
const { createBatchResolver, createBatchLoadFn } = require('graphql-batching-helpers');
用法
createBatchResolver
createBatchResolver
函数可以将查询的多个 fieldName 合并为单个请求:
-- -------------------- ---- ------- ----- - ------------------- - - ------------------------------------ ----- --------------- - ------------------------- ------ ----- -------- ----- -- - ----- ---- - ----- ---------------------- -- -------- ------ ------------ -- ----------- --- ----- ------ - --- --------------- ------ --- ------------------- ----- -------- ------- - ------- - ----- --- ----------------------- ----- - ---- - ----- --- ---------------------- - -- -------- ------------------------ - ------- ----- --------- ----- -- ----- ----- ----- -------- ----- -- - -- --- ----- --------- ----- ------ - ----- ----------------------- ------ ------- -- -- -- --- ---
参数:
batchLoadFn
:一个异步函数,负责将查询信息加载到批处理结果中options
:一个包含以下属性的对象:keyArg
:一个字符串,指定用于查找结果的输入参数名称batchArg
:一个字符串,指定批处理加载的数组输入参数名称keyFn
:一个该字段的输入参数转换函数,将查询的输入参数映射到它们在返回值中的位置。如果未提供,则默认情况下期望 key 值与输入参数名称相同。batchFn
:一个对输入参数的筛选器函数,限制查找多个请求数据(默认情况下返回数组中所有内容)。函数接受批组的查询参数和整个请求参数
resolver
:单个 fieldName 的标准返回值,具有参数和上下文。
createBatchLoadFn
createBatchLoadFn
函数可以将查询的多个 fieldName 合并为单个请求:
-- -------------------- ---- ------- ----- - ----------------- - - ------------------------------------ ----- ------------- - ----------------------- ------ ----- -------- ----- -- - ----- ---- - ----- ---------------------- ------ ------------ -- ----------- --- ----- ------ - --- --------------- ------ --- ------------------- ----- -------- ------- - ------ - ----- ---------- ----- - --- - ----- --------- - -- -------- -------------------- ---- ----- -------- ----- -- - -- --- ----- --------- ----- ----- - ----- --------------------- ------ ------ --- -- ----- - ----- --------- ----- - --- - ----- --------- - -- -------- ---------------------------------- ----- ----- ----- -------- ----- -- - -- --- ---- --------- ----- ----- - ----- ---------------------- ------ ------ --- -- -- --- ---
参数:
batchLoadFn
:一个用于将 query 中的信息加载到批处理结果中的异步函数options
:在没有使用 createBatchResolver 的情况下遵循keyArg
:一个字符串,指定用于查找结果的输入参数名称keyFn
:一个该字段的输入参数转换函数,将查询的输入参数映射到它们在返回值中的位置
示例
以下示例代码展示了如何使用 graphql-batching-helpers
解析一个用户的帖子和评论。用户需要首先解析所有帖子,然后解析所有评论:
-- -------------------- ---- ------- ----- - -------------------- ----------------- - - ------------------------------------ ----- --------------- - ----------------------- ------ -- - -- -------------- -- --------------- ----- ----- - ----- ----------------------- ------ ------------------ ----- -- - ------------ - ----- ------ ---- -- ---- --- ----- ------------------ - ----------------------- ------ -- - -- --------- -- --------------- ----- -------- - ----- -------------------------- ------ --------------------- -------- -- - --------------- - -------- ------ ---- -- ---- --- ----- ----------------- - --------------------- ------ ----- --------- ------ -- ----- ------ ----- -------- ----- -- - -- ------------ ----- ----- - ----- ------------------------------ -- -- ----- ------- --- ----- ----- -------- - ----- --------------------------------- -- -- ----- ---------- --- ----- ------ ------------ -- -- -------------- --------- -------------- ---- --- ----- ------ - --- --------------- ------ --- ------------------- ----- -------- ------- - ----- - ----- --------- ----- - --- - ----- --------- - -- -------- ------------------ -- -- --- ---
在这个示例中, 通过前端传来的用户 id,我们首先通过 userBatchResolver
将用户的帖子和评论合并成单个请求,然后异步地加载帖子和评论(分别使用 postBatchResolver()
和 commentBatchResolver()
),最后将帖子和评论组装成 UserType
的返回值。
总结
使用 graphql-batching-helpers
,可以轻松优化 GraphQL 查询性能。本文我们介绍了这个 npm 包的两个函数 createBatchResolver
和 createBatchLoadFn
,并提供了详细的使用教程和示例代码。希望这篇文章能让你更好地理解这个工具,并在实践中提高 GraphQL 的性能!
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6005601581e8991b448de2ca