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 组合成一个新的类型。这是一种非常有用的机制,因为它允许我们在查询中组合两个或多个类型的结果。
如下面示例代码:
union SearchResult = User | Post type Query { search(query: String!): [SearchResult!]! }
上面的 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