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:
- Int: Un enter de 32 bits.
- Float: Un nombre de coma flotant de precisió doble.
- String: Una cadena de text UTF-8.
- Boolean: Un valor que pot ser
true
ofalse
. - ID: Un identificador únic, sovint utilitzat per identificar objectes de manera única.
Exemple d'ús dels escalars predefinits
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
- Definició en l'esquema: Primer, definim el nou tipus d'escalar en el nostre esquema GraphQL.
- 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; } });
- 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
- Definició en l'esquema: Defineix un nou tipus d'escalar
Email
.
- 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'); } });
- 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.
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