Plugins Apollo
Plugins vous permettent d’étendre la fonctionnalité de base d’Apollo Server en exécutant des opérations personnalisées en réponse à certains événements. Actuellement, ces événements correspondent aux phases individuelles du cycle de vie des requêtes GraphQL et au démarrage d’Apollo Server lui-même (lisez-en plus ici). Par exemple, un plugin de journalisation de base pourrait enregistrer la chaîne de requête GraphQL associée à chaque requête envoyée à Apollo Server.
Plugins personnalisés
Pour créer un plugin, déclarez une classe annotée avec le décorateur @Plugin
exporté du package @nestjs/apollo
. De plus, pour une meilleure autocomplétion du code, implémentez l’interface ApolloServerPlugin
du package @apollo/server
.
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'); }, }; }}
Avec cela en place, nous pouvons enregistrer le LoggingPlugin
en tant que fournisseur.
@Module({ providers: [LoggingPlugin],})export class CommonModule {}
Nest instanciera automatiquement un plugin et l’appliquera au serveur Apollo.
Utilisation de plugins externes
Il existe plusieurs plugins fournis par défaut. Pour utiliser un plugin existant, importez-le simplement et ajoutez-le au tableau plugins
:
GraphQLModule.forRoot({ // ... plugins: [ ApolloServerOperationRegistry({ /* options */ }), ],});
Plugins avec Mercurius
Certains des plugins Fastify spécifiques à mercurius existants doivent être chargés après le plugin mercurius (lisez-en plus ici) sur l’arborescence des plugins.
Pour cela, MercuriusDriver
expose une option de configuration plugins
optionnelle. Elle représente un tableau d’objets qui se composent de deux attributs : plugin
et ses options
. Par conséquent, l’enregistrement du plugin cache ressemblerait à ceci :
GraphQLModule.forRoot({ driver: MercuriusDriver, // ... plugins: [ { plugin: cache, options: { ttl: 10, policy: { Query: { add: true, }, }, }, }, ],});