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

调用解析器以验证并解析字段,并将其输出合并到响应中,这一过程由两个特殊指令实现:@validate 和 @resolveValueAndMerge。这些指令属于特殊类型——它们不是由应用程序(无论是在 Query 中还是在 schema 中)添加的,而是由引擎本身添加的。这两个指令是隐式的,会始终添加到每个 Query 的每个字段上。
从这一机制可以看出,在 GraphQL 服务器上执行 Query 时,实际上涉及两个 Query:
- 请求 Query
- 可执行 Query
可执行 Query 是最终由服务器解析的 Query,它是通过对请求 Query 应用转换后生成的,其中包括为每个字段添加 @validate 和 @resolveValueAndMerge 指令。

例如,如果请求 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 中定义严格的字段执行顺序
Prev
Next