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:

type Query {
  hello: String
  user(id: ID!): User
}

type User {
  id: ID!
  name: String
  age: Int
}

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

  1. 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.

  2. 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.

  3. Resolvers del tipus User:

    name: (parent) => parent.name,
    age: (parent) => parent.age,
    

    Aquests resolvers simplement retornen els valors dels camps name i age de l'objecte parent, que és l'usuari retornat pel resolver de la consulta user.

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ó:

  1. Actualitzeu l'esquema:

    type User {
      id: ID!
      name: String
      age: Int
      email: String
    }
    
  2. 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ó:

  1. Actualitzeu l'esquema:

    type Mutation {
      createUser(name: String!, age: Int!, email: String!): User
    }
    
  2. 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

  1. 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.

  2. 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.

  3. 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.

© Copyright 2024. Tots els drets reservats