Les subscripcions de GraphQL permeten que els clients rebin actualitzacions en temps real des del servidor. Això és especialment útil per a aplicacions que necessiten actualitzacions instantànies, com ara aplicacions de xat, notificacions en temps real, o qualsevol altra aplicació que requereixi dades actualitzades contínuament.
Conceptes Clau
- Què són les subscripcions?
Les subscripcions són una operació de GraphQL que permet als clients subscriure's a esdeveniments específics al servidor. Quan es produeix un esdeveniment, el servidor envia les dades actualitzades als clients subscrits.
- Com funcionen les subscripcions?
Les subscripcions utilitzen WebSockets per mantenir una connexió oberta entre el client i el servidor. Això permet que el servidor enviï dades al client en temps real sense que el client hagi de fer sol·licituds repetides.
- Estructura d'una subscripció
Una subscripció de GraphQL té una estructura similar a una consulta o mutació, però utilitza la paraula clau subscription
.
Exemple Pràctic
- Definició de l'esquema
Primer, definim una subscripció en el nostre esquema de GraphQL. Suposem que tenim una aplicació de xat i volem subscriure'ns a nous missatges.
type Message { id: ID! content: String! author: String! } type Subscription { messageAdded: Message }
- Implementació del Resolver
A continuació, implementem el resolver per a la subscripció. Utilitzarem una biblioteca com graphql-subscriptions
per gestionar les subscripcions.
const { PubSub } = require('graphql-subscriptions'); const pubsub = new PubSub(); const resolvers = { Subscription: { messageAdded: { subscribe: () => pubsub.asyncIterator(['MESSAGE_ADDED']) } } }; // Quan s'afegeix un nou missatge, publiquem l'esdeveniment function addMessage(message) { pubsub.publish('MESSAGE_ADDED', { messageAdded: message }); }
- Configuració del servidor
Per utilitzar subscripcions, necessitem configurar el nostre servidor per suportar WebSockets. Aquí utilitzem Apollo Server
.
const { ApolloServer } = require('apollo-server'); const { makeExecutableSchema } = require('@graphql-tools/schema'); const { createServer } = require('http'); const { execute, subscribe } = require('graphql'); const { SubscriptionServer } = require('subscriptions-transport-ws'); const typeDefs = /* Definicions de tipus */; const resolvers = /* Resolvers */; const schema = makeExecutableSchema({ typeDefs, resolvers }); const server = new ApolloServer({ schema }); const httpServer = createServer(server); server.listen().then(({ url }) => { console.log(`🚀 Server ready at ${url}`); new SubscriptionServer({ execute, subscribe, schema }, { server: httpServer, path: '/graphql', }); });
- Client
Finalment, configurem el client per subscriure's a les actualitzacions. Utilitzarem Apollo Client
.
import { ApolloClient, InMemoryCache, split } from '@apollo/client'; import { WebSocketLink } from '@apollo/client/link/ws'; import { getMainDefinition } from '@apollo/client/utilities'; const httpLink = /* Enllaç HTTP */; const wsLink = new WebSocketLink({ uri: `ws://localhost:4000/graphql`, options: { reconnect: true } }); const splitLink = split( ({ query }) => { const definition = getMainDefinition(query); return ( definition.kind === 'OperationDefinition' && definition.operation === 'subscription' ); }, wsLink, httpLink ); const client = new ApolloClient({ link: splitLink, cache: new InMemoryCache() }); // Subscripció a nous missatges client.subscribe({ query: gql` subscription { messageAdded { id content author } } ` }).subscribe({ next(data) { console.log(data); } });
Exercici Pràctic
Exercici 1: Subscripció a nous usuaris
- Definició de l'esquema: Afegeix una subscripció per a nous usuaris.
- Implementació del Resolver: Implementa el resolver per a la subscripció.
- Configuració del servidor: Assegura't que el servidor estigui configurat per suportar subscripcions.
- Client: Configura el client per subscriure's a nous usuaris.
Solució
- Definició de l'esquema:
- Implementació del Resolver:
const { PubSub } = require('graphql-subscriptions'); const pubsub = new PubSub(); const resolvers = { Subscription: { userAdded: { subscribe: () => pubsub.asyncIterator(['USER_ADDED']) } } }; // Quan s'afegeix un nou usuari, publiquem l'esdeveniment function addUser(user) { pubsub.publish('USER_ADDED', { userAdded: user }); }
-
Configuració del servidor: Igual que en l'exemple anterior.
-
Client:
client.subscribe({ query: gql` subscription { userAdded { id name email } } ` }).subscribe({ next(data) { console.log(data); } });
Conclusió
Les subscripcions de GraphQL són una eina poderosa per a aplicacions que necessiten actualitzacions en temps real. Amb una configuració adequada del servidor i del client, podem implementar subscripcions de manera eficient i efectiva. Aquest mòdul ha cobert els conceptes bàsics, la implementació pràctica i un exercici per reforçar l'aprenentatge. En el següent mòdul, explorarem altres eines i l'ecosistema de GraphQL.
Curs de GraphQL
Mòdul 1: Introducció a GraphQL
- Què és GraphQL?
- GraphQL vs REST
- Configuració d'un servidor GraphQL
- Conceptes bàsics de l'esquema de GraphQL
Mòdul 2: Conceptes bàsics
Mòdul 3: Disseny avançat d'esquemes
Mòdul 4: Treballant amb dades
- Connexió a una base de dades
- Estratègies de recuperació de dades
- Agrupació i emmagatzematge en memòria cau
- Gestió d'errors
Mòdul 5: Rendiment i seguretat
Mòdul 6: Eines i ecosistema
Mòdul 7: Proves i desplegament
- Proves unitàries de resolvers
- Proves d'integració
- Integració contínua
- Desplegament de servidors GraphQL