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

  1. Errors de resolució: Errors que es produeixen durant l'execució d'una consulta o mutació.
  2. Errors de validació: Errors que es produeixen quan la consulta no compleix amb l'esquema definit.
  3. Errors de xarxa: Errors relacionats amb la comunicació entre el client i el servidor.
  4. 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.

query {
  user(id: "invalid-id") {
    id
    name
  }
}

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ó

  1. Crea un resolver per a una consulta post que retorni un post per ID.
  2. Si el post no es troba, retorna un error amb el missatge "Post not found".
  3. 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

  1. Crea un error personalitzat InvalidPostError.
  2. 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.

© Copyright 2024. Tots els drets reservats