架构
架构处理 schema 类型指令

处理 schema 类型指令

Gato GraphQL 是一个 code-first 服务器,即使用代码来开发 schema。(与之相对的是 SDL-first 方式,它使用 Schema Definition Language 先生成 schema,再开发服务。)

由于没有 SDL,code-first 服务器无法自然地支持 schema 类型指令。为了避免这一限制,Gato GraphQL 开发了以下机制:

这使得 GraphQL 服务器能够完整地支持 schema 类型指令。

为什么有效?

@deprecated 是一个 schema 类型指令,因此必须应用于 schema。然而,如果我们暂时假设它是一个 Query 类型指令,并直接在 Query 的某个字段上添加 @deprecated,会发生什么呢?

例如,执行以下 Query 时:

query {
  posts {
    id
    title
    content @deprecated(reason: "Use newContent instead")
  }
}

它同样可以正常工作!因为归根结底,指令不过是在字段上执行的某种功能;无论是通过 schema 声明该功能,还是直接在 Query 中声明,功能的行为并没有任何区别。

不过,虽然可以正常工作,但这样做毫无意义。我们不能强迫客户端在 Query 中添加 @deprecated。这是由服务端应用决定的功能,而不是由客户端决定的。

然而,功能本身仍然有效。因此,从功能角度来看,将指令添加到 schema 还是 Query 中并不重要。此外,每个指令最终都会出现在 Query 中,因为那才是它被执行的地方。

因此,即使服务器没有 SDL,也可以在运行时将指令嵌入到 Query 中。