Graphql

插件

学习如何在 NestJS GraphQL 中使用插件来扩展 GraphQL 功能,包括内置插件和自定义插件的创建与配置。

插件

插件使您能够通过添加自定义业务逻辑来扩展 Apollo Server 的核心功能。例如,插件可以执行身份验证、日志记录、缓存和错误处理。要使用现有插件或创建自定义插件,请将其传递给 GraphQLModuleplugins 属性。

GraphQLModule.forRoot<ApolloDriverConfig>({
  driver: ApolloDriver,
  typePaths: ['./**/*.graphql'],
  plugins: [ApolloServerPluginLandingPageLocalDefault()],
}),

缓存

缓存是一种提高应用程序性能的技术。Apollo Server 提供了一个内存缓存实现。

要启用缓存,请将 cache 属性传递给 GraphQLModuleforRoot() 方法。

GraphQLModule.forRoot<ApolloDriverConfig>({
  driver: ApolloDriver,
  typePaths: ['./**/*.graphql'],
  cache: 'bounded',
}),

自定义插件

要创建自定义插件,请声明一个实现 ApolloServerPlugin 接口的类。

import { ApolloServerPlugin, GraphQLRequestListener } from '@apollo/server';
import { Plugin } from '@nestjs/apollo';

@Plugin()
export class LoggingPlugin implements ApolloServerPlugin {
  requestDidStart(): GraphQLRequestListener<any> {
    console.log('Request started');
    return {
      willSendResponse() {
        console.log('Will send response');
      },
    };
  }
}

有了这个,我们可以在提供者数组中注册 LoggingPlugin

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

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

或者,插件可以通过传递给 plugins 属性来内联定义:

GraphQLModule.forRoot<ApolloDriverConfig>({
  driver: ApolloDriver,
  typePaths: ['./**/*.graphql'],
  plugins: [
    {
      requestDidStart() {
        console.log('Request started');
        return {
          willSendResponse() {
            console.log('Will send response');
          },
        };
      },
    },
  ],
}),

了解更多关于创建插件的信息,请访问 Apollo 文档

使用第三方插件

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

GraphQLModule.forRoot<ApolloDriverConfig>({
  driver: ApolloDriver,
  typePaths: ['./**/*.graphql'],
  plugins: [ApolloServerPluginLandingPageLocalDefault()],
}),

ApolloServerPluginLandingPageLocalDefault 插件从 @apollo/server/plugin/landingPage/default 包导入。