引言
GraphQL 作为一款数据查询语言,可有效地降低前后端的耦合度,加速开发效率,并提供了更好的数据查询方式。在使用 GraphQL 进行数据查询时,Apollo Client 是一个非常好的选择。
Apollo Client 提供了丰富的查询及更新数据的 API,支持查询带参数的 GraphQL 数据。不过,在使用带参数的 GraphQL 查询时,我们可能会遇到一些问题。本文主要介绍 Apollo Client 中使用带参数的 GraphQL 查询时,遇到的问题及解决方法。
问题描述
在开发中,我们经常会使用带参数的 GraphQL 请求来查询数据。例如,我们需要查询一个用户的详细信息,可以发送如下的 GraphQL 请求:
query GetUser($id: ID!) { user(id: $id) { id name email } }
上述查询中,我们设置了一个 $id
参数,类型为 ID!
。该参数用于查询用户详细信息,而且是必填参数。
使用 Apollo Client,我们可以通过如下的方法发送查询请求:
-- -------------------- ---- ------- ------ - --- - ---- ----------------- ----- -------- - ---- ----- ------------ ---- - -------- ---- - -- ---- ----- - - -- ----- - ----- -------- ----- - - ------------------ - ---------- - --- ------ -- ---展开代码
上述代码中,我们使用了 useQuery
钩子函数,指定了 GET_USER
查询请求,并通过 variables
参数传递了 $id
参数的值。
但是,当我们运行代码时,可能会遇到如下的错误信息:
GraphQL error: Variable "$id" of required type "ID!" was not provided.
这个错误信息提示我们没有正确地为 $id
参数传递值,即使我们已经在 variables
参数中传递了。
问题分析
上述问题发生的原因是:在 Apollo Client 中,如果查询请求中包含变量参数,并且该变量是必填参数(即类型为 XXX!
),则需要在 variables
参数中进行赋值,否则就会出现上述错误。
具体来说,useQuery
钩子函数会将 variables
参数作为查询请求的参数请求,然后将其中的变量在查询请求中进行替换。但是,如果在 variables
中没有为必填参数赋值,将会导致查询请求中的必填参数出现空值或为 undefined
,从而导致 GraphQL 异常。
在我们的例子中,id
参数为必填参数,但是在 variables
参数中没有进行赋值。因此,Apollo Client 在执行查询请求时,会检查必填参数的值是否为空,并根据不同的情况生成相应的错误。
解决办法
为了解决上述问题,我们需要正确设置变量参数的值,并将其传递到 useQuery
钩子函数的 variables
参数中。
可以通过以下两种方式解决:
- 使用默认值
在 GraphQL 中,我们可以为变量参数设置默认值。在定义查询请求时,可以使用 $id: ID! = 0
这样的方式设置变量 $id
的默认值为 0。如果 variables
参数中未指定 $id
的值,则使用默认值。
使用默认值后,我们可以将 $id
参数类型从 ID!
更改为 ID
,这样即使不传递 $id
参数值,GraphQL 也不会抛出异常。
修改后的查询请求如下:
query GetUser($id: ID = 0) { user(id: $id) { id name email } }
使用 Apollo Client 发送带参数的查询请求时,可以将 variables
参数中 $id
参数的默认值设置为 0
:
const { data, loading, error } = useQuery(GET_USER, { variables: { id: userId || 0 }, });
如果 userId
为 undefined
或 null
,则使用 $id
参数的默认值 0
。
- 排除必填参数
除了使用默认值外,我们还可以将必填参数排除在外,避免将其置为空值或未定义状态。
可以通过删除必填参数类型 !
的方式实现。在查询请求中,将参数类型从 XXX!
更改为 XXX
,并将查询请求中的必填参数作为可选参数进行处理。
修改后的查询请求如下:
query GetUser($id: ID) { user(id: $id) { id name email } }
使用 Apollo Client 发送带参数的查询请求时,可以将 variables
参数中的 $id
参数设置为可选参数,并在没有值的情况下将其设置为 undefined
。
const { data, loading, error } = useQuery(GET_USER, { variables: { id: userId || undefined }, });
这样,即使 userId
为 undefined
或 null
,$id参数也将是
undefined`,而不会将其设置为空值或未定义状态,从而避免了 GraphQL 的异常情况。
总结
在使用 Apollo Client 进行带参数的 GraphQL 查询时,如果参数中包含必填参数,要注意必须正确地为其赋值,否则将会引发 GraphQL 异常,导致查询失败。
本文介绍了两种解决方法:使用默认值和将必填参数排除在外。通过正确地绑定变量参数,我们可以成功地进行带参数的 GraphQL 查询,提高了开发效率并避免了 GraphQL 异常,对前端开发有一定的指导意义。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65204b7995b1f8cacd7ca1ca