Passer au contenu

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.

Exemple de plugin de journalisation
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.

Enregistrement du plugin dans le module
@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 :

Utilisation de plugin dans GraphQLModule
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 :

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