Els resolvers són una part fonamental de qualsevol servidor GraphQL. Són les funcions responsables de proporcionar les dades per a cada camp en l'esquema de GraphQL. En aquest tema, aprendrem què són els resolvers, com funcionen i com crear-los.
Què és un Resolver?
Un resolver és una funció que s'executa cada vegada que es fa una consulta o una mutació a un camp específic de l'esquema de GraphQL. La seva tasca principal és obtenir les dades necessàries per a aquest camp. Els resolvers poden obtenir dades de diverses fonts, com ara bases de dades, serveis externs o fins i tot càlculs en temps real.
Com Funcionen els Resolvers?
Quan un client fa una consulta a un servidor GraphQL, el servidor analitza la consulta i crida els resolvers corresponents per obtenir les dades. Cada camp en l'esquema de GraphQL pot tenir el seu propi resolver. Si un camp no té un resolver específic, GraphQL utilitza un resolver per defecte que simplement retorna el valor del camp amb el mateix nom en l'objecte pare.
Exemple de Resolver
Vegem un exemple pràctic per entendre millor com funcionen els resolvers. Suposem que tenim l'esquema següent:
Ara, crearem els resolvers per a aquest esquema:
const resolvers = { Query: { hello: () => 'Hola, món!', user: (parent, args, context, info) => { // Suposem que tenim una funció getUserById que obté un usuari per ID return getUserById(args.id); }, }, User: { name: (parent) => parent.name, age: (parent) => parent.age, }, }; function getUserById(id) { // Aquesta és una funció simulada que retorna un usuari fictici const users = [ { id: '1', name: 'Joan', age: 30 }, { id: '2', name: 'Maria', age: 25 }, ]; return users.find(user => user.id === id); }
Explicació del Codi
-
Resolver de la consulta
hello
:hello: () => 'Hola, món!',
Aquest resolver simplement retorna la cadena "Hola, món!" quan es fa una consulta al camp
hello
. -
Resolver de la consulta
user
:user: (parent, args, context, info) => { return getUserById(args.id); },
Aquest resolver crida la funció
getUserById
amb l'ID proporcionat en els arguments (args.id
) i retorna l'usuari corresponent. -
Resolvers del tipus
User
:name: (parent) => parent.name, age: (parent) => parent.age,
Aquests resolvers simplement retornen els valors dels camps
name
iage
de l'objecteparent
, que és l'usuari retornat pel resolver de la consultauser
.
Exercicis Pràctics
Exercici 1: Crear un Resolver per a un Nou Camp
Afegiu un nou camp email
al tipus User
i creeu el resolver corresponent.
Solució:
-
Actualitzeu l'esquema:
type User { id: ID! name: String age: Int email: String }
-
Afegiu el resolver per al camp
email
:const resolvers = { Query: { hello: () => 'Hola, món!', user: (parent, args, context, info) => { return getUserById(args.id); }, }, User: { name: (parent) => parent.name, age: (parent) => parent.age, email: (parent) => parent.email, }, }; function getUserById(id) { const users = [ { id: '1', name: 'Joan', age: 30, email: '[email protected]' }, { id: '2', name: 'Maria', age: 25, email: '[email protected]' }, ]; return users.find(user => user.id === id); }
Exercici 2: Crear un Resolver per a una Mutació
Afegiu una mutació createUser
que permeti crear un nou usuari i retorni l'usuari creat.
Solució:
-
Actualitzeu l'esquema:
type Mutation { createUser(name: String!, age: Int!, email: String!): User }
-
Afegiu el resolver per a la mutació
createUser
:const resolvers = { Query: { hello: () => 'Hola, món!', user: (parent, args, context, info) => { return getUserById(args.id); }, }, Mutation: { createUser: (parent, args) => { const newUser = { id: String(users.length + 1), name: args.name, age: args.age, email: args.email, }; users.push(newUser); return newUser; }, }, User: { name: (parent) => parent.name, age: (parent) => parent.age, email: (parent) => parent.email, }, }; const users = [ { id: '1', name: 'Joan', age: 30, email: '[email protected]' }, { id: '2', name: 'Maria', age: 25, email: '[email protected]' }, ]; function getUserById(id) { return users.find(user => user.id === id); }
Errors Comuns i Consells
-
No retornar dades en el resolver: Assegureu-vos que cada resolver retorni les dades correctes. Si un resolver no retorna res, el camp corresponent serà
null
. -
No gestionar errors: Gestioneu els errors dins dels resolvers per proporcionar missatges d'error útils als clients. Podeu utilitzar
try-catch
per capturar i gestionar errors. -
No utilitzar el context adequadament: El context és útil per passar informació compartida entre resolvers, com ara autenticació o connexions a bases de dades. Assegureu-vos d'utilitzar-lo quan sigui necessari.
Resum
En aquesta secció, hem après què són els resolvers, com funcionen i com crear-los. Hem vist exemples pràctics de resolvers per a consultes i mutacions, i hem practicat amb exercicis per reforçar els conceptes apresos. Els resolvers són una part essencial de qualsevol servidor GraphQL, ja que són responsables d'obtenir les dades per a cada camp en l'esquema. Amb una comprensió sòlida dels resolvers, estareu ben preparats per construir aplicacions GraphQL eficients i robustes.
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