Introducción a GraphQL
GraphQL es un lenguaje de consulta para APIs y un entorno de ejecución para realizar esas consultas con tus datos existentes. Fue desarrollado internamente por Facebook en 2012 y lanzado públicamente en 2015. A diferencia de REST, donde tienes múltiples endpoints para diferentes recursos, con GraphQL tienes un único endpoint que te permite solicitar exactamente los datos que necesitas.
Ventajas de GraphQL
- Consulta precisa: Permite a los clientes solicitar exactamente los datos que necesitan.
- Menos solicitudes: Reduce el número de solicitudes HTTP necesarias.
- Evolución de la API: Facilita la evolución de la API sin afectar a los clientes existentes.
- Tipado fuerte: Utiliza un sistema de tipos para definir la estructura de la API.
Configuración del Entorno
Para empezar a usar GraphQL con Node.js, necesitas configurar tu entorno. Vamos a utilizar Express.js y Apollo Server para este propósito.
Instalación de Dependencias
Primero, crea un nuevo proyecto de Node.js y navega a su directorio:
Luego, instala las dependencias necesarias:
Configuración de Apollo Server con Express
Crea un archivo index.js y configura Apollo Server con Express:
const express = require('express');
const { ApolloServer, gql } = require('apollo-server-express');
// Definición del esquema
const typeDefs = gql`
type Query {
hello: String
}
`;
// Definición de los resolvers
const resolvers = {
Query: {
hello: () => '¡Hola, mundo!',
},
};
// Creación del servidor Apollo
const server = new ApolloServer({ typeDefs, resolvers });
const app = express();
server.applyMiddleware({ app });
// Iniciar el servidor
app.listen({ port: 4000 }, () =>
console.log(`🚀 Servidor listo en http://localhost:4000${server.graphqlPath}`)
);Explicación del Código
- Definición del Esquema: Utilizamos el lenguaje de esquema de GraphQL para definir un tipo
Querycon un campohelloque devuelve una cadena. - Definición de los Resolvers: Los resolvers son funciones que resuelven las consultas definidas en el esquema. En este caso, el resolver para
hellodevuelve la cadena'¡Hola, mundo!'. - Creación del Servidor Apollo: Creamos una instancia de
ApolloServerpasando el esquema y los resolvers. - Integración con Express: Aplicamos el middleware de Apollo Server a la aplicación Express.
- Inicio del Servidor: Iniciamos el servidor en el puerto 4000 y mostramos un mensaje en la consola.
Consultas y Mutaciones
Definición de Tipos y Consultas
Vamos a extender nuestro esquema para incluir más tipos y consultas. Supongamos que estamos construyendo una API para gestionar libros y autores.
const typeDefs = gql`
type Book {
title: String
author: Author
}
type Author {
name: String
books: [Book]
}
type Query {
books: [Book]
authors: [Author]
}
`;
const books = [
{ title: 'El Quijote', author: { name: 'Miguel de Cervantes' } },
{ title: 'Cien Años de Soledad', author: { name: 'Gabriel García Márquez' } },
];
const authors = [
{ name: 'Miguel de Cervantes', books: [{ title: 'El Quijote' }] },
{ name: 'Gabriel García Márquez', books: [{ title: 'Cien Años de Soledad' }] },
];
const resolvers = {
Query: {
books: () => books,
authors: () => authors,
},
};Ejemplo de Consulta
Con el esquema y los resolvers definidos, puedes realizar consultas como la siguiente:
Esta consulta devolverá una lista de libros con sus respectivos autores.
Definición de Mutaciones
Las mutaciones en GraphQL permiten modificar datos. Vamos a añadir una mutación para agregar un nuevo libro.
const typeDefs = gql`
type Book {
title: String
author: Author
}
type Author {
name: String
books: [Book]
}
type Query {
books: [Book]
authors: [Author]
}
type Mutation {
addBook(title: String, authorName: String): Book
}
`;
const resolvers = {
Query: {
books: () => books,
authors: () => authors,
},
Mutation: {
addBook: (_, { title, authorName }) => {
const newBook = { title, author: { name: authorName } };
books.push(newBook);
return newBook;
},
},
};Ejemplo de Mutación
Puedes realizar la siguiente mutación para agregar un nuevo libro:
mutation {
addBook(title: "Don Quijote", authorName: "Miguel de Cervantes") {
title
author {
name
}
}
}Ejercicio Práctico
Ejercicio
- Objetivo: Extender la API para incluir un tipo
Publishery permitir la adición de nuevos editores. - Pasos:
- Añadir el tipo
Publisheral esquema. - Añadir una consulta para obtener todos los editores.
- Añadir una mutación para agregar un nuevo editor.
- Añadir el tipo
Solución
const typeDefs = gql`
type Book {
title: String
author: Author
publisher: Publisher
}
type Author {
name: String
books: [Book]
}
type Publisher {
name: String
books: [Book]
}
type Query {
books: [Book]
authors: [Author]
publishers: [Publisher]
}
type Mutation {
addBook(title: String, authorName: String, publisherName: String): Book
addPublisher(name: String): Publisher
}
`;
const publishers = [
{ name: 'Editorial Planeta', books: [] },
{ name: 'Penguin Random House', books: [] },
];
const resolvers = {
Query: {
books: () => books,
authors: () => authors,
publishers: () => publishers,
},
Mutation: {
addBook: (_, { title, authorName, publisherName }) => {
const newBook = { title, author: { name: authorName }, publisher: { name: publisherName } };
books.push(newBook);
return newBook;
},
addPublisher: (_, { name }) => {
const newPublisher = { name, books: [] };
publishers.push(newPublisher);
return newPublisher;
},
},
};Ejemplo de Consulta y Mutación
Consulta para obtener todos los editores:
Mutación para agregar un nuevo editor:
Conclusión
En esta sección, hemos aprendido los conceptos básicos de GraphQL y cómo integrarlo con Node.js utilizando Apollo Server y Express. Hemos cubierto la definición de esquemas, consultas, mutaciones y cómo extender la API para incluir nuevos tipos. Con estos conocimientos, estás preparado para construir APIs más eficientes y flexibles utilizando GraphQL.
En el siguiente módulo, exploraremos cómo desplegar aplicaciones Node.js y gestionar el entorno de producción. ¡Sigue adelante!
Curso de Node.js
Módulo 1: Introducción a Node.js
Módulo 2: Conceptos Básicos
Módulo 3: Sistema de Archivos y E/S
Módulo 4: HTTP y Servidores Web
- Creando un Servidor HTTP Simple
- Manejo de Solicitudes y Respuestas
- Sirviendo Archivos Estáticos
- Enrutamiento
Módulo 5: NPM y Gestión de Paquetes
- Introducción a NPM
- Instalación y Uso de Paquetes
- Creación y Publicación de Paquetes
- Versionado Semántico
Módulo 6: Framework Express.js
- Introducción a Express.js
- Configuración de una Aplicación Express
- Middleware
- Enrutamiento en Express
- Manejo de Errores
Módulo 7: Bases de Datos y ORMs
- Introducción a las Bases de Datos
- Usando MongoDB con Mongoose
- Usando Bases de Datos SQL con Sequelize
- Operaciones CRUD
Módulo 8: Autenticación y Autorización
- Introducción a la Autenticación
- Usando Passport.js
- Autenticación JWT
- Control de Acceso Basado en Roles
Módulo 9: Pruebas y Depuración
- Introducción a las Pruebas
- Pruebas Unitarias con Mocha y Chai
- Pruebas de Integración
- Depuración de Aplicaciones Node.js
Módulo 10: Temas Avanzados
- Módulo Cluster
- Hilos de Trabajo
- Optimización del Rendimiento
- Construcción de APIs RESTful
- GraphQL con Node.js
Módulo 11: Despliegue y DevOps
- Variables de Entorno
- Usando PM2 para la Gestión de Procesos
- Desplegando en Heroku
- Integración y Despliegue Continuos
