GraphQL 中手动进行 type 覆盖的方法

阅读时长 4 分钟读完

GraphQL 是一个用于 API 的查询语言以及一种由 Facebook 开发的服务端运行库。它允许客户端在 API 中描述所需数据的形状,并从服务端获取到精确的数据。在 GraphQL 中,通过定义 schema 和 resolver 来定义所有可查询数据。然而有时候我们需要手动进行 type 覆盖。

GraphQL schema 和类型系统

GraphQL 中的 schema 定义了 API 中的所有可用字段以及它们之间的关系。这包括查询和变更。而类型系统则定义了所有请求和响应中编码的数据类型。

GraphQL 请求中的类型系统由 query、mutation 和 subscription 等模块来定义。每个模块都由一个或多个字段组成。而传入的参数和返回的数据都有特定的类型。

例如,下面的代码定义了一个简单的 schema,它提供了一个查询类型,以返回 Greetings 字符串。

类型覆盖

在 GraphQL 中,类型系统通过 code-first 和 schema-first 两种方法定义。在 code-first 中,基本类型、自定义类型和输入类型等都是由代码自动生成的。在 schema-first 中,类型系统是由开发者定义的,并通过代码生成器生成相应的代码。

在某些情况下,我们需要手动进行类型覆盖。这种情况通常发生在类型系统被动态更改或在复杂的嵌套查询中。

基本数据类型的覆盖

在一个查询或变异中,如果你希望更改基本的 GraphQL 数据类型,如 Int、String 或 Boolean,那么可以通过手动覆盖这些基本类型来实现。

以下面的代码为例,它定义了一个返回整数的查询,

现在,我们想返回一个随机的浮点数,我们需要定义一个新的类型覆盖 Int 类型,如下所示:

这里,我们定义了一个新类型 Float,该类型与 Int 类型具有相同的返回值特征,并将 Query 类型中的 randomNumber 字段的类型更改为 Float。

嵌套类型的覆盖

在一个复杂的嵌套查询中,有时候我们希望重写某个字段的类型。假设我们有一个名为 Post 的类型,该类型具有包含其他类型的字段。我们可以通过重写嵌套类型来更改字段类型。

以下面的代码为例,

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

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

现在,我们想将 author 字段改为仅包含 id 和 name 属性,而忽略 Post 类型。我们可以在 Author 类型中定义新字段,然后覆盖 posts 类型,如下所示:

这里,我们定义了一个新类型 postIds,该类型只包含 id 属性。在 posts 字段上,我们使用 @deprecated 和 @skip 指令来防止查询器使用它。这意味着开发者需要在查询中使用新的 postIds 字段,而不是之前的 posts 字段。

总结

GraphQL 中的类型系统和 schema 定义了 API 中的可用字段和所有请求和响应中编码的数据类型。有时候我们需要手动覆盖某些类型以更改 API 返回的数据。对于基本数据类型,我们可以通过重写想要改变的类型来达到目的。对于嵌套类型,我们需要定义新字段并覆盖想要更改的类型。

手动覆盖 GraphQL 的类型可能存在风险,因此在进行类型处理之前,请确保您已经了解了所有相关的安全问题。

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

纠错
反馈