Les mutacions en GraphQL són operacions que permeten modificar dades en el servidor. A diferència de les consultes, que només llegeixen dades, les mutacions poden crear, actualitzar o eliminar dades. En aquest tema, aprendrem com definir i utilitzar mutacions en GraphQL.
Continguts
Definició de Mutacions
Les mutacions es defineixen en l'esquema de GraphQL de manera similar a les consultes, però s'utilitza la paraula clau mutation
en lloc de query
. Les mutacions poden tenir arguments i retornar tipus complexos, igual que les consultes.
Estructura d'una Mutació
Una mutació en GraphQL té la següent estructura bàsica:
En aquest exemple, la mutació createUser
pren dos arguments (name
i email
) i retorna un objecte de tipus User
.
Definició del Tipus de Mutació
Primer, definim el tipus de mutació en l'esquema:
Definició del Tipus de Retorn
Després, definim el tipus de retorn, en aquest cas, User
:
Implementació del Resolver
Finalment, implementem el resolver per a la mutació:
const resolvers = { Mutation: { createUser: (parent, args, context, info) => { const newUser = { id: generateUniqueId(), name: args.name, email: args.email, }; // Aquí afegim el nou usuari a la base de dades o a la llista d'usuaris users.push(newUser); return newUser; }, }, };
Exemple Pràctic
Vegem un exemple complet de com definir i utilitzar una mutació per crear un nou usuari.
Esquema
type Mutation { createUser(name: String!, email: String!): User } type User { id: ID! name: String! email: String! }
Resolver
const { ApolloServer, gql } = require('apollo-server'); const typeDefs = gql` type Mutation { createUser(name: String!, email: String!): User } type User { id: ID! name: String! email: String! } `; let users = []; const generateUniqueId = () => '_' + Math.random().toString(36).substr(2, 9); const resolvers = { Mutation: { createUser: (parent, args, context, info) => { const newUser = { id: generateUniqueId(), name: args.name, email: args.email, }; users.push(newUser); return newUser; }, }, }; const server = new ApolloServer({ typeDefs, resolvers }); server.listen().then(({ url }) => { console.log(`🚀 Server ready at ${url}`); });
Executar la Mutació
Podem executar la mutació utilitzant una eina com GraphiQL o Apollo Playground:
mutation { createUser(name: "John Doe", email: "[email protected]") { id name email } }
Exercicis Pràctics
-
Crear un Producte: Defineix una mutació
createProduct
que prenguiname
iprice
com a arguments i retorni un objecteProduct
ambid
,name
iprice
. -
Actualitzar un Usuari: Defineix una mutació
updateUser
que prenguiid
,name
iemail
com a arguments i retorni l'objecteUser
actualitzat. -
Eliminar un Usuari: Defineix una mutació
deleteUser
que prenguiid
com a argument i retorni un missatge de confirmació.
Solucions
Solució 1: Crear un Producte
Esquema
type Mutation { createProduct(name: String!, price: Float!): Product } type Product { id: ID! name: String! price: Float! }
Resolver
const resolvers = { Mutation: { createProduct: (parent, args, context, info) => { const newProduct = { id: generateUniqueId(), name: args.name, price: args.price, }; products.push(newProduct); return newProduct; }, }, };
Solució 2: Actualitzar un Usuari
Esquema
Resolver
const resolvers = { Mutation: { updateUser: (parent, args, context, info) => { const user = users.find(user => user.id === args.id); if (!user) { throw new Error('User not found'); } if (args.name) user.name = args.name; if (args.email) user.email = args.email; return user; }, }, };
Solució 3: Eliminar un Usuari
Esquema
Resolver
const resolvers = { Mutation: { deleteUser: (parent, args, context, info) => { const userIndex = users.findIndex(user => user.id === args.id); if (userIndex === -1) { throw new Error('User not found'); } users.splice(userIndex, 1); return 'User deleted successfully'; }, }, };
Errors Comuns i Consells
- No retornar el tipus correcte: Assegura't que la mutació retorna el tipus especificat en l'esquema.
- No gestionar errors: Implementa una gestió d'errors adequada per a situacions com ara no trobar l'usuari o el producte.
- No validar els arguments: Valida els arguments abans de processar la mutació per evitar errors inesperats.
Conclusió
Les mutacions són una part fonamental de GraphQL que permeten modificar dades en el servidor. Hem après com definir i implementar mutacions, així com alguns exemples pràctics i exercicis per reforçar els conceptes apresos. En el següent tema, explorarem els resolvers en més detall.
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