La gestió d'errors és una part fonamental del desenvolupament d'aplicacions robustes i fiables. En aquest tema, aprendrem com gestionar errors en un servidor GraphQL, com informar d'aquests errors als clients i com assegurar-nos que la nostra API sigui el més clara i útil possible quan es produeixin problemes.
Conceptes Clau
- Errors de resolució: Errors que es produeixen durant l'execució d'una consulta o mutació.
- Errors de validació: Errors que es produeixen quan la consulta no compleix amb l'esquema definit.
- Errors de xarxa: Errors relacionats amb la comunicació entre el client i el servidor.
- Errors personalitzats: Errors definits per l'usuari per a situacions específiques de l'aplicació.
Tipus d'Errors en GraphQL
Errors de Resolució
Els errors de resolució es produeixen quan un resolver no pot completar la seva tasca. Aquests errors poden ser deguts a problemes de base de dades, errors de lògica, o altres problemes d'execució.
const resolvers = { Query: { user: async (parent, args, context, info) => { try { const user = await context.db.User.findById(args.id); if (!user) { throw new Error('User not found'); } return user; } catch (error) { throw new Error('Failed to fetch user'); } }, }, };
Errors de Validació
Els errors de validació es produeixen quan la consulta no compleix amb l'esquema definit. Aquests errors són gestionats automàticament per GraphQL.
Aquest tipus de consulta retornarà un error de validació perquè l'ID no és vàlid segons l'esquema.
Errors de Xarxa
Els errors de xarxa es produeixen quan hi ha problemes de comunicació entre el client i el servidor. Aquests errors no són específics de GraphQL, però és important tenir-los en compte.
Errors Personalitzats
Podem definir errors personalitzats per a situacions específiques de la nostra aplicació. Això ens permet proporcionar missatges d'error més clars i útils als nostres usuaris.
class UserInputError extends Error { constructor(message) { super(message); this.name = 'UserInputError'; } } const resolvers = { Mutation: { createUser: async (parent, args, context, info) => { if (!args.email.includes('@')) { throw new UserInputError('Invalid email address'); } // Resta del codi per crear l'usuari }, }, };
Informar d'Errors als Clients
Quan es produeix un error en GraphQL, aquest es retorna al client en el camp errors
de la resposta.
{ "data": null, "errors": [ { "message": "User not found", "locations": [ { "line": 2, "column": 3 } ], "path": [ "user" ] } ] }
Exercici Pràctic
Exercici 1: Gestió d'Errors de Resolució
- Crea un resolver per a una consulta
post
que retorni un post per ID. - Si el post no es troba, retorna un error amb el missatge "Post not found".
- Si hi ha un error de base de dades, retorna un error amb el missatge "Failed to fetch post".
const resolvers = { Query: { post: async (parent, args, context, info) => { try { const post = await context.db.Post.findById(args.id); if (!post) { throw new Error('Post not found'); } return post; } catch (error) { throw new Error('Failed to fetch post'); } }, }, };
Exercici 2: Errors Personalitzats
- Crea un error personalitzat
InvalidPostError
. - Utilitza aquest error en un resolver per a una mutació
createPost
que validi que el títol del post no estigui buit.
class InvalidPostError extends Error { constructor(message) { super(message); this.name = 'InvalidPostError'; } } const resolvers = { Mutation: { createPost: async (parent, args, context, info) => { if (!args.title) { throw new InvalidPostError('Title cannot be empty'); } // Resta del codi per crear el post }, }, };
Resum
En aquesta secció, hem après sobre els diferents tipus d'errors que poden ocórrer en una API GraphQL i com gestionar-los adequadament. Hem vist com informar d'aquests errors als clients i com crear errors personalitzats per a situacions específiques. La gestió d'errors és crucial per a proporcionar una experiència d'usuari robusta i fiable, i és una habilitat essencial per a qualsevol desenvolupador de GraphQL.
En el següent mòdul, explorarem estratègies per optimitzar les consultes i millorar el rendiment de la nostra API 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