插件可让您通过执行自定义操作来响应某些事件,从而扩展 Apollo Server 的核心功能。目前,这些事件对应于 GraphQL 请求生命周期的各个阶段,以及 Apollo Server 本身的启动(阅读更多信息,请 此处)。例如,基本日志记录插件可能会记录与发送到 Apollo Server 的每个请求相关的 GraphQL 查询字符串。
自定义插件
要创建插件,请声明一个使用从 @nestjs/apollo
包导出的 @Plugin
装饰器注释的类。此外,为了更好地自动完成代码,请从 @apollo/server
包中实现 ApolloServerPlugin
接口。
ts
import { ApolloServerPlugin, GraphQLRequestListener } from '@apollo/server'
import { Plugin } from '@nestjs/apollo'
@Plugin()
export class LoggingPlugin implements ApolloServerPlugin {
async requestDidStart(): Promise<GraphQLRequestListener<any>> {
console.log('Request started')
return {
async willSendResponse() {
console.log('Will send response')
},
}
}
}
有了这个,我们可以将LoggingPlugin
注册为提供程序。
ts
@Module({
providers: [LoggingPlugin],
})
export class CommonModule {}
Nest 将自动实例化插件并将其应用于 Apollo 服务器。
使用外部插件
有几个现成的插件。要使用现有插件,只需将其导入并将其添加到plugins
数组中:
ts
GraphQLModule.forRoot({
// ...
plugins: [ApolloServerOperationRegistry({ /* options */})]
})
ApolloServerOperationRegistry
插件从 @apollo/server-plugin-operation-registry
包导出。
Mercurius 插件
一些现有的 mercurius 专用 Fastify 插件必须在插件树上的 mercurius 插件之后加载(阅读更多信息 此处)。
mercurius-upload 是一个例外,应在主文件中注册。
为此,MercuriusDriver
公开了一个可选的 plugins
配置选项。它表示一个由两个属性组成的对象数组:plugin
及其 options
。因此,注册 cache 插件 应如下所示:
ts
GraphQLModule.forRoot({
driver: MercuriusDriver,
// ...
plugins: [
{
plugin: cache,
options: {
ttl: 10,
policy: {
Query: {
add: true
}
}
},
}
]
})