架构
架构请求 Query 与可执行 Query 的解耦

请求 Query 与可执行 Query 的解耦

Gato GraphQL 使用指令管道,这是一种使服务器引擎能够解析、验证和执行 Query 的架构。为了让引擎尽可能简单,与 Query 解析相关的所有操作都通过指令在管道内完成。

指令管道

调用解析器以验证并解析字段,并将其输出合并到响应中,这一过程由两个特殊指令实现:@validate@resolveValueAndMerge。这些指令属于特殊类型——它们不是由应用程序(无论是在 Query 中还是在 schema 中)添加的,而是由引擎本身添加的。这两个指令是隐式的,会始终添加到每个 Query 的每个字段上。

从这一机制可以看出,在 GraphQL 服务器上执行 Query 时,实际上涉及两个 Query:

  • 请求 Query
  • 可执行 Query

可执行 Query 是最终由服务器解析的 Query,它是通过对请求 Query 应用转换后生成的,其中包括为每个字段添加 @validate@resolveValueAndMerge 指令。

GraphQL 服务器内部流程

例如,如果请求 Query 如下:

{
  posts {
    url
    title @uppercase
    content @include(if: $addContent)
  }
}

则可执行 Query 将变为:

{
  posts @validate @resolveValueAndMerge {
    url @validate @resolveValueAndMerge
    title @validate @resolveValueAndMerge @uppercase
    content @validate @include(if: $addContent) @resolveValueAndMerge
  }
}

使用场景

Gato GraphQL 在以下情况下使用此机制来生成可执行 Query:

  • 添加系统类型指令(例如 @validate@resolveValueAndMerge
  • 通过指令实现 IFTTT 添加任意指令
  • 在 Multiple Query Execution 中定义严格的字段执行顺序