指令可以附加在字段或片段包含上,能够以服务器所需的任何方式影响查询的执行(了解更多此处 )。GraphQL 规范提供了几个默认指令:
@include(if: Boolean) - 仅当参数为 true 时,在结果中包含此字段@skip(if: Boolean) - 当参数为 true 时跳过此字段@deprecated(reason: String) - 通过消息将字段标记为已弃用指令是一个以 @ 字符开头的标识符,后面可以跟随一组命名参数,它可以出现在 GraphQL 查询和模式语言中几乎任何元素之后。
要指定当 Apollo/Mercurius 遇到您的指令时应执行的操作,您可以创建一个转换器函数。该函数使用 mapSchema 函数遍历模式中的位置(字段定义、类型定义等)并执行相应的转换。
现在,在 GraphQLModule#forRoot 方法中使用 transformSchema 函数应用 upperDirectiveTransformer 转换函数:
注册后,@upper 指令就可以在我们的模式中使用。不过,应用指令的方式会根据你采用的方法(代码优先或模式优先)而有所不同。
在代码优先方法中,使用 @Directive() 装饰器来应用指令。
@Directive() 装饰器是从 @nestjs/graphql 包中导出的。
指令可以应用于字段、字段解析器、输入和对象类型,以及查询、变更和订阅操作。以下是将指令应用于查询处理器层级的示例:
通过 @Directive() 装饰器应用的指令不会反映在生成的模式定义文件中。
最后,请确保在 GraphQLModule 中声明指令,如下所示:
GraphQLDirective 和 DirectiveLocation 均从 graphql 包中导出。
在模式优先方法中,直接在 SDL 中应用指令。
type Post { id: Int! title: String! @upper votes: Int }