创建灵活且具有弹性的 GraphQL Schema

阅读时长 5 分钟读完

GraphQL 是一种用于 API 设计的查询语言,它提供了一种与客户端交互的强大方式。GraphQL 查询语言的一个重要部分就是 schema,它定义了 API 中所有可查询的对象、字段以及如何关联它们。创建灵活且具有弹性的 GraphQL schema 是保证 API 可扩展性的关键所在。

理解 GraphQL 的 Schema

在了解如何创建灵活且具有弹性的 GraphQL schema 之前,我们先来理解一下 GraphQL schema 的基本概念。

GraphQL schema 包含两个核心部分:type 和 resolver。type 定义了可查询的对象以及字段,而 resolver 定义了每个字段的实现方式。

一个 GraphQL schema 的定义看起来像下面这样:

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

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

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

这个 schema 包含了三个类型:Query、Author 和 Book。在 Query 类型中,我们定义了两个查询函数,它们都接受一个参数 id,并返回类型为 Author 和 Book。在 Author 和 Book 类型中,我们定义了它们各自的属性。

利用 Interfaces 和 Unions 提升可扩展性

Interfaces 和 Unions 是 GraphQL 扩展 schema 的两个主要机制,并且它们都是非常强大的工具。

Interfaces

Interfaces 允许我们定义一个接口,用于描述 GraphQL 中的一个或多个类型所共有的字段。这使得我们可以编写更通用的代码,因为它不会与具体实现耦合在一起。

如下面示例代码:

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

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

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

上面的 schema 中,我们定义了一个 Entity 接口。它包含了两个属性:id、createdAt 和 updatedAt。然后我们定义了两个实现 Entity 接口的类型:User 和 Post。这意味着 User 和 Post 类型都有一个 id、createdAt 和 updatedAt 属性。

尽管 User 和 Post 类型有一些特定属性,但是它们都具有一个公共属性,因此我们可以查询任何实现了 Entity 的类型并获得它们共享的属性。

Unions

Unions 允许我们将两个或多个不同的 types 组合成一个新的类型。这是一种非常有用的机制,因为它允许我们在查询中组合两个或多个类型的结果。

如下面示例代码:

上面的 schema 中,我们定义了一个 SearchResult union。它可以是 User 或 Post 类型中的一个。然后我们在 Query 类型中定义了一个 search 函数,它接受一个查询参数 query,返回 SearchResult 的数组。

这意味着当我们查询 search 函数时,我们将获得一个 SearchResult 的数组,并且每个 SearchResult 对象可能是 User 或 Post 类型中的一个。

利用 Directives 管理 GraphQL Schema

Directives 是一种在运行时修改 GraphQL schema 的机制。它们可以针对特定的字段或类型进行条件检查、控制查询结果集、添加元数据等。

我们可以使用自定义指令或内建(built-in)指令来动态修改 schema,并在执行查询时应用这些指令。

如下面示例代码:

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

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

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

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

上面的 schema 中,我们定义了两个内建指令:@skip 和 @include。这两个指令可以在定义 User 类型时用来控制其 books 字段的行为。

在 books 字段上,我们在 schema 中使用了 @skip(if: true) 和 @include(if: false),这使得 books 字段在查询时被跳过。

总结

在本文中,我们了解了如何创建灵活且具有弹性的 GraphQL schema,包括使用 Interfaces 和 Unions 提升可扩展性以及使用 Directives 管理 schema。

GraphQL 的 schema 是 API 设计的基础,因此正确地设计 schema 将对 API 的长期发展产生深远的影响。在实践中,我们应该努力编写可重用的 schema,并根据 API 的实际需求进行优化。

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

纠错
反馈