如何解决 GraphQL Schema 扩展问题

GraphQL 是一种用于 API 的查询语言及为其设计的运行时环境。但随着应用程序的复杂性增加,我们需要时不时地扩展现有 Schema,让它更好地适应新需求。然而,Schema 的扩展并不总是容易的。在本文中,我们将学习一些常见技巧和策略,以帮助您更轻松地进行 GraphQL Schema 扩展。

Schema 扩展概述

在 GraphQL 中,Schema 的构建是通过 Type 和 Field 的组合完成的。类型定义基于需要的领域概念,而字段是在这个过程中根据内容一步步添加的。

Schema 扩展通常需要添加新的 Type 和 Field,同时还可能需要更新现有的 Type 和 Field。解决这个问题的一种方法是使用 GraphQL 的 Schema 语言,我们可以轻松地声明新的 Type 和 Field,然后将它们添加到现有的 Schema 中。这可以通过如下方式实现:

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

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

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

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

其中,我们通过声明两个新的类型 User 和 UserUpdateInput 来扩展现有的 Schema 。我们还添加了一个 updateUser 的 Mutation,它接受一个 UserUpdateInput 作为参数,并返回更新后的 User。

要将这些添加到 Schema 中,我们只需要在原始 Schema 的定义中包含这些新的声明。

在扩展现有类型时使用 Fragments

在某些情况下,我们需要更新现有的类型定义中的字段,例如添加一个新的字段或更改现有字段的类型。在这种情况下,最好使用 GraphQL 的 Fragment 来帮助我们扩展现有类型。

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

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

在上面的例子中,我们使用了 Fragment 的 extend 操作符。这告诉 GraphQL 我们要扩展现有的 User 类型,并向其添加 age 字段。

使用 Fragment 的另一个好处是可以避免重复代码。例如,如果我们需要在多个地方使用相同的 User 类型定义,我们可以将其定义在一个 Fragment 中,然后在需要的地方引用它。

在 Mutation 中使用 Input 类型

当更新现有类型的字段时,通常会使用 Input 类型。 Input 类型用于将一组输入作为单个参数传递给查询或 Mutation。

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

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

上面的代码中,我们定义了一个 UserInput 类型来传递需要的用户数据,然后将其用作 Mutation 中 addUser 的参数。这种方法可以大大简化代码,并使我们能够将多个参数打包到一个输入类型中,而不是在 Mutation 中使用多个参数。

在扩展时使用 Union 和 Interface

Union 和 Interface 是 Abstract Types,它们定义了一组共享相同字段的 Object Types。如果我们需要在现有 Schema 中添加新类型,Union 和 Interface 就可以派上用场了。

使用这些 Abstract Types 的好处之一是它们可以在各种情况下共享字段。例如,如果我们要添加一个新的 Object Type(如 Group),它将共享与现有类型相同的字段(如 User 和 Team)。

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

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

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

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

在上面的代码中,我们使用接口 NamedEntity 来定义一组共享相同字段的 Object Types(User、Group 和 Team)。这将使我们的代码更加灵活、易于维护,并且可以轻松扩展现有 Schema。

结论

在 GraphQL 中,Schema 扩展是一个不可避免的过程,但有许多技术和策略可以帮助我们更轻松地进行这种扩展。本文介绍了一些常见的技术和策略,例如使用 GraphQL 的 Schema 语言、Fragments、Input 类型、Union 和 Interface 等等。使用这些技术和策略,我们可以更好地适应应用程序的需求,并使我们的代码更加优雅、通用和易于维护。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6731be0c0bc820c5823a2eda