Els escalars són els tipus de dades més bàsics en GraphQL. Representen valors atòmics que no es poden descompondre en altres tipus. Els escalars són essencials per definir els tipus de dades que les nostres consultes i mutacions poden retornar o acceptar com a arguments.

Tipus d'Escalars Predefinits

GraphQL ve amb una sèrie de tipus d'escalars predefinits que cobreixen les necessitats més comunes:

  1. Int: Un enter de 32 bits.
  2. Float: Un nombre de coma flotant de precisió doble.
  3. String: Una cadena de text UTF-8.
  4. Boolean: Un valor que pot ser true o false.
  5. ID: Un identificador únic, sovint utilitzat per identificar objectes de manera única.

Exemple d'ús dels escalars predefinits

type User {
  id: ID!
  name: String!
  age: Int
  isActive: Boolean!
  balance: Float
}

En aquest exemple, el tipus User utilitza diversos escalars predefinits per definir les seves propietats.

Creació d'Escalars Personalitzats

A més dels escalars predefinits, GraphQL permet la creació d'escalars personalitzats per a casos d'ús específics. Per exemple, podríem necessitar un tipus Date per representar dates.

Definició d'un escalar personalitzat

  1. Definició en l'esquema: Primer, definim el nou tipus d'escalar en el nostre esquema GraphQL.
scalar Date
  1. Implementació del resolutor: Després, implementem el resolutor per al nostre escalar personalitzat. Això inclou la serialització, deserialització i validació dels valors.
const { GraphQLScalarType, Kind } = require('graphql');

const DateScalar = new GraphQLScalarType({
  name: 'Date',
  description: 'A custom scalar type for dates',
  serialize(value) {
    // Convert the Date object to an ISO string for the client
    return value.toISOString();
  },
  parseValue(value) {
    // Convert the ISO string from the client to a Date object
    return new Date(value);
  },
  parseLiteral(ast) {
    if (ast.kind === Kind.STRING) {
      // Convert the AST string literal to a Date object
      return new Date(ast.value);
    }
    return null;
  }
});
  1. Incorporació en l'esquema: Finalment, incorporem el resolutor en el nostre esquema GraphQL.
const { makeExecutableSchema } = require('@graphql-tools/schema');

const typeDefs = `
  scalar Date

  type Event {
    id: ID!
    name: String!
    date: Date!
  }

  type Query {
    events: [Event]
  }
`;

const resolvers = {
  Date: DateScalar,
  Query: {
    events: () => [
      { id: '1', name: 'Conference', date: new Date() },
      { id: '2', name: 'Meetup', date: new Date() }
    ]
  }
};

const schema = makeExecutableSchema({ typeDefs, resolvers });

Exercicis Pràctics

Exercici 1: Crear un escalar personalitzat per a correus electrònics

  1. Definició en l'esquema: Defineix un nou tipus d'escalar Email.
scalar Email
  1. Implementació del resolutor: Implementa el resolutor per al tipus Email que valida que el valor sigui un correu electrònic vàlid.
const EmailScalar = new GraphQLScalarType({
  name: 'Email',
  description: 'A custom scalar type for email addresses',
  serialize(value) {
    return value;
  },
  parseValue(value) {
    if (typeof value !== 'string' || !value.includes('@')) {
      throw new Error('Invalid email address');
    }
    return value;
  },
  parseLiteral(ast) {
    if (ast.kind === Kind.STRING && ast.value.includes('@')) {
      return ast.value;
    }
    throw new Error('Invalid email address');
  }
});
  1. Incorporació en l'esquema: Incorpora el resolutor en el teu esquema GraphQL.
const typeDefs = `
  scalar Email

  type User {
    id: ID!
    email: Email!
  }

  type Query {
    users: [User]
  }
`;

const resolvers = {
  Email: EmailScalar,
  Query: {
    users: () => [
      { id: '1', email: '[email protected]' },
      { id: '2', email: '[email protected]' }
    ]
  }
};

const schema = makeExecutableSchema({ typeDefs, resolvers });

Solució de l'Exercici 1

const { GraphQLScalarType, Kind } = require('graphql');
const { makeExecutableSchema } = require('@graphql-tools/schema');

const EmailScalar = new GraphQLScalarType({
  name: 'Email',
  description: 'A custom scalar type for email addresses',
  serialize(value) {
    return value;
  },
  parseValue(value) {
    if (typeof value !== 'string' || !value.includes('@')) {
      throw new Error('Invalid email address');
    }
    return value;
  },
  parseLiteral(ast) {
    if (ast.kind === Kind.STRING && ast.value.includes('@')) {
      return ast.value;
    }
    throw new Error('Invalid email address');
  }
});

const typeDefs = `
  scalar Email

  type User {
    id: ID!
    email: Email!
  }

  type Query {
    users: [User]
  }
`;

const resolvers = {
  Email: EmailScalar,
  Query: {
    users: () => [
      { id: '1', email: '[email protected]' },
      { id: '2', email: '[email protected]' }
    ]
  }
};

const schema = makeExecutableSchema({ typeDefs, resolvers });

Conclusió

Els escalars són una part fonamental de GraphQL, proporcionant els blocs de construcció bàsics per als nostres esquemes. A més dels escalars predefinits, podem crear escalars personalitzats per adaptar-nos a les necessitats específiques de la nostra aplicació. Amb la pràctica, la creació i l'ús d'escalars personalitzats esdevindrà una eina poderosa en el teu arsenal de desenvolupament GraphQL.

© Copyright 2024. Tots els drets reservats