Migration de v11 à v10
Ce chapitre fournit un ensemble de directives pour migrer de la version @nestjs/graphql 10 à 11. Dans le cadre de cette version majeure, nous avons mis à jour le pilote Apollo pour être compatible avec Apollo Server v4 (au lieu de v3). Note : il y a plusieurs changements de rupture dans Apollo Server v4 (en particulier autour des plugins et des packages de l’écosystème), donc vous devrez mettre à jour votre code en conséquence. Pour plus d’informations, consultez le guide de migration d’Apollo Server v4.
Packages Apollo
Au lieu d’installer le package apollo-server-express, vous devrez installer @apollo/server :
$ npm uninstall apollo-server-express$ npm install @apollo/serverSi vous utilisez l’adaptateur Fastify, vous devrez installer le package @as-integrations/fastify à la place :
$ npm uninstall apollo-server-fastify$ npm install @apollo/server @as-integrations/fastifyPackages Mercurius
Le passage vers Mercurius gateway n’est plus inclus dans le package mercurius. À la place, vous devrez installer le package @mercuriusjs/gateway séparément :
$ npm install @mercuriusjs/gatewayDe même, pour créer des schémas fédérés, vous devrez installer le package @mercuriusjs/federation :
$ npm install @mercuriusjs/federationMigrer de v10 à v9
Ce chapitre fournit un ensemble de directives pour migrer de la version @nestjs/graphql 9 à 10. L’objectif de cette version majeure est de fournir une bibliothèque centrale plus légère et agnostique par rapport à la plateforme.
Introduction des “packages” de pilote
Dans la dernière version, nous avons décidé de diviser le package @nestjs/graphql en plusieurs bibliothèques distinctes, vous permettant de choisir d’utiliser Apollo (@nestjs/apollo), Mercurius (@nestjs/mercurius), ou une autre bibliothèque GraphQL dans votre projet.
Cela implique que vous devez maintenant spécifier explicitement quel pilote votre application utilisera.
import { Module } from '@nestjs/common';import { GraphQLModule } from '@nestjs/graphql';
@Module({ imports: [ GraphQLModule.forRoot({ autoSchemaFile: 'schema.gql', }), ],})export class AppModule {}import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo';import { Module } from '@nestjs/common';import { GraphQLModule } from '@nestjs/graphql';
@Module({ imports: [ GraphQLModule.forRoot<ApolloDriverConfig>({ driver: ApolloDriver, autoSchemaFile: 'schema.gql', }), ],})export class AppModule {}Plugins
Les plugins Apollo Server vous permettent d’exécuter des opérations personnalisées en réponse à certains événements. Comme il s’agit d’une fonctionnalité exclusive à Apollo, nous l’avons déplacée du package @nestjs/graphql vers le nouveau package @nestjs/apollo, donc vous devrez mettre à jour les imports dans votre application.
import { Plugin } from '@nestjs/graphql';import { Plugin } from '@nestjs/apollo';Directives
La fonctionnalité schemaDirectives a été remplacée par le nouvel API des directives de schéma dans la v8 du package @graphql-tools/schema.
import { SchemaDirectiveVisitor } from '@graphql-tools/utils';import { defaultFieldResolver, GraphQLField } from 'graphql';
export class UpperCaseDirective extends SchemaDirectiveVisitor { visitFieldDefinition(field: GraphQLField<any, any>) { const { resolve = defaultFieldResolver } = field; field.resolve = async function (...args) { const result = await resolve.apply(this, args); if (typeof result === 'string') { return result.toUpperCase(); } return result; }; }}import { getDirective, MapperKind, mapSchema } from '@graphql-tools/utils';import { defaultFieldResolver, GraphQLSchema } from 'graphql';
export function upperDirectiveTransformer( schema: GraphQLSchema, directiveName: string,) { return mapSchema(schema, { [MapperKind.OBJECT_FIELD]: (fieldConfig) => { const upperDirective = getDirective(schema, fieldConfig, directiveName)?.[0];
if (upperDirective) { const { resolve = defaultFieldResolver } = fieldConfig;
fieldConfig.resolve = async function (source, args, context, info) { const result = await resolve(source, args, context, info); if (typeof result === 'string') { return result.toUpperCase(); } return result; }; } return fieldConfig; }, });}Pour appliquer cette implémentation de directive à un schéma contenant des directives @upper, utilisez la fonction transformSchema :
GraphQLModule.forRoot<ApolloDriverConfig>({ ... transformSchema: (schema) => upperDirectiveTransformer(schema, 'upper'),});Fédération
Le GraphQLFederationModule a été supprimé et remplacé par la classe de pilote correspondante :
GraphQLFederationModule.forRoot({ autoSchemaFile: true,});GraphQLModule.forRoot<ApolloFederationDriverConfig>({ driver: ApolloFederationDriver, autoSchemaFile: true,});De même, au lieu d’utiliser un GraphQLGatewayModule dédié, il suffit de passer la classe de pilote appropriée à vos paramètres GraphQLModule :
GraphQLModule.forRoot<ApolloGatewayDriverConfig>({ driver: ApolloGatewayDriver, gateway: { supergraphSdl: new IntrospectAndCompose({ subgraphs: [ { name: 'users', url: 'http://localhost:3000/graphql' }, { name: 'posts', url: 'http://localhost:3001/graphql' }, ], }), },});