Introducció a les Unions en GraphQL
Les unions en GraphQL permeten definir un tipus que pot ser un de diversos tipus diferents. Això és útil quan es vol retornar diferents tipus d'objectes en una sola consulta. Les unions són similars a les interfícies, però a diferència d'aquestes, no requereixen que els tipus que les implementen comparteixin cap camp comú.
Definició d'Unions
Sintaxi bàsica
Per definir una union en GraphQL, utilitzem la paraula clau union
seguida del nom de la union i els tipus que la componen.
En aquest exemple, SearchResult
és una union que pot ser un User
, un Post
o un Comment
.
Exemple pràctic
Suposem que tenim els següents tipus definits en el nostre esquema:
type User { id: ID! name: String! } type Post { id: ID! title: String! content: String! } type Comment { id: ID! text: String! }
Podem definir una union SearchResult
que pot ser qualsevol d'aquests tres tipus:
Utilització d'Unions en Consultes
Quan utilitzem unions en les nostres consultes, hem de fer servir fragments per especificar com volem que es resolguin els diferents tipus.
Exemple de consulta
query { search(term: "GraphQL") { ... on User { id name } ... on Post { id title content } ... on Comment { id text } } }
En aquesta consulta, search
retorna un SearchResult
, que pot ser un User
, un Post
o un Comment
. Utilitzem fragments per especificar quins camps volem per a cada tipus.
Implementació de Resolvers per a Unions
Quan implementem resolvers per a unions, hem de proporcionar una funció de resolució per a la union que determini quin tipus específic s'ha de retornar.
Exemple de resolver
const resolvers = { Query: { search: (parent, args, context, info) => { // Lògica per buscar usuaris, posts i comentaris // Retorna una llista de resultats que poden ser de diferents tipus }, }, SearchResult: { __resolveType(obj, context, info) { if (obj.name) { return 'User'; } if (obj.title) { return 'Post'; } if (obj.text) { return 'Comment'; } return null; }, }, };
En aquest exemple, la funció __resolveType
determina el tipus de cada objecte retornat per la consulta search
.
Exercici Pràctic
Enunciat
- Defineix una union
Media
que pugui ser unPhoto
o unVideo
. - Defineix els tipus
Photo
iVideo
amb els següents camps:Photo
:id
,url
,description
Video
:id
,url
,duration
- Escriu una consulta
media
que retorni una llista deMedia
. - Implementa els resolvers necessaris per a la consulta
media
i la unionMedia
.
Solució
Esquema
type Photo { id: ID! url: String! description: String } type Video { id: ID! url: String! duration: Int } union Media = Photo | Video type Query { media: [Media] }
Resolvers
const resolvers = { Query: { media: () => { return [ { id: '1', url: 'http://example.com/photo1.jpg', description: 'A beautiful sunrise', __typename: 'Photo' }, { id: '2', url: 'http://example.com/video1.mp4', duration: 120, __typename: 'Video' }, ]; }, }, Media: { __resolveType(obj, context, info) { if (obj.description) { return 'Photo'; } if (obj.duration) { return 'Video'; } return null; }, }, };
Consulta
Conclusió
Les unions en GraphQL són una eina poderosa per retornar diferents tipus d'objectes en una sola consulta. Utilitzant fragments i resolvers adequats, podem gestionar fàcilment aquestes estructures complexes i proporcionar respostes flexibles i riques en dades.
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