Skip to main content

插件

使用 Apollo 的插件

插件使您能够通过在响应某些事件时执行自定义操作来扩展 Apollo Server 的核心功能。 目前,这些事件对应于 GraphQL 请求生命周期的各个阶段, 以及 Apollo Server 本身的启动(详细信息请参阅此处)。 例如,一个基本的日志记录插件可能会记录与发送到 Apollo Server 的每个请求相关联的 GraphQL 查询字符串。

自定义插件

要创建一个插件,请声明一个使用 @nestjs/apollo 包导出的 @Plugin 装饰器注释的类。 此外,为了更好的代码自动完成,实现 @apollo/server 包的 ApolloServerPlugin 接口。

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 注册为提供者。

@Module({
providers: [LoggingPlugin],
})
export class CommonModule {}

Nest 将自动实例化插件并将其应用于 Apollo Server。

使用外部插件

有几个现成的插件可供使用。要使用现有插件,只需导入它并将其添加到plugins数组中:

GraphQLModule.forRoot({
// ...
plugins: [ApolloServerOperationRegistry({ /* options */})]
}),
tip

ApolloServerOperationRegistry 插件是从 @apollo/server-plugin-operation-registry 包导出的。

在 Mercurius 中使用插件

一些现有的 mercurius-specific Fastify 插件必须在插件树上的 mercurius 插件之后加载(详细信息请参阅此处)。

warning

mercurius-upload 是一个例外,应在主文件中注册。

为此,MercuriusDriver 公开了一个可选的 plugins 配置选项。 它表示由两个属性组成的对象数组:plugin 和其options。 因此,注册缓存插件将如下所示:

GraphQLModule.forRoot({
driver: MercuriusDriver,
// ...
plugins: [
{
plugin: cache,
options: {
ttl: 10,
policy: {
Query: {
add: true
}
}
},
}
]
}),