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

