En este módulo, aprenderemos cómo conectar un servidor GraphQL a una base de datos. Este es un paso crucial para cualquier aplicación que necesite almacenar y recuperar datos de manera eficiente. Exploraremos cómo configurar la conexión, realizar consultas y mutaciones, y manejar errores comunes.
Objetivos de Aprendizaje
- Configurar una conexión a una base de datos desde un servidor GraphQL.
- Realizar consultas y mutaciones a la base de datos.
- Manejar errores comunes en la conexión a la base de datos.
- Configuración de la Conexión a la Base de Datos
Paso 1: Instalación de Dependencias
Para este ejemplo, utilizaremos Node.js con Express y una base de datos PostgreSQL. Necesitaremos instalar las siguientes dependencias:
Paso 2: Configuración de Sequelize
Sequelize es un ORM (Object-Relational Mapping) para Node.js que facilita la interacción con bases de datos SQL. Configuraremos Sequelize para conectarnos a nuestra base de datos PostgreSQL.
// db.js
const { Sequelize } = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
host: 'localhost',
dialect: 'postgres',
});
module.exports = sequelize;Paso 3: Definición de Modelos
Definimos nuestros modelos de datos utilizando Sequelize. Por ejemplo, un modelo de Usuario podría verse así:
// models/User.js
const { DataTypes } = require('sequelize');
const sequelize = require('../db');
const User = sequelize.define('User', {
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true,
},
name: {
type: DataTypes.STRING,
allowNull: false,
},
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
},
});
module.exports = User;Paso 4: Sincronización de la Base de Datos
Sincronizamos nuestros modelos con la base de datos para asegurarnos de que las tablas se crean correctamente.
// sync.js
const sequelize = require('./db');
const User = require('./models/User');
sequelize.sync({ force: true }).then(() => {
console.log('Database & tables created!');
});
- Realización de Consultas y Mutaciones
Consultas
Para realizar consultas, definimos resolvers que interactúan con nuestros modelos de Sequelize.
// resolvers.js
const User = require('./models/User');
const resolvers = {
Query: {
users: async () => {
return await User.findAll();
},
user: async (_, { id }) => {
return await User.findByPk(id);
},
},
};
module.exports = resolvers;Mutaciones
Las mutaciones permiten modificar los datos en la base de datos.
// resolvers.js
const resolvers = {
Mutation: {
createUser: async (_, { name, email }) => {
return await User.create({ name, email });
},
updateUser: async (_, { id, name, email }) => {
const user = await User.findByPk(id);
if (!user) throw new Error('User not found');
user.name = name;
user.email = email;
await user.save();
return user;
},
deleteUser: async (_, { id }) => {
const user = await User.findByPk(id);
if (!user) throw new Error('User not found');
await user.destroy();
return user;
},
},
};
module.exports = resolvers;
- Manejo de Errores Comunes
Error de Conexión
Un error común es la incapacidad de conectarse a la base de datos. Asegúrate de que los detalles de conexión (nombre de la base de datos, usuario, contraseña, host) sean correctos.
sequelize.authenticate()
.then(() => {
console.log('Connection has been established successfully.');
})
.catch(err => {
console.error('Unable to connect to the database:', err);
});Error de Validación
Los errores de validación ocurren cuando los datos no cumplen con las restricciones definidas en el modelo.
try {
await User.create({ name: '', email: 'invalid-email' });
} catch (error) {
console.error('Validation error:', error);
}Ejercicio Práctico
Ejercicio 1: Crear y Consultar Usuarios
- Crear Usuarios: Implementa una mutación para crear un nuevo usuario.
- Consultar Usuarios: Implementa una consulta para obtener todos los usuarios.
Solución
# schema.graphql
type User {
id: ID!
name: String!
email: String!
}
type Query {
users: [User]
user(id: ID!): User
}
type Mutation {
createUser(name: String!, email: String!): User
updateUser(id: ID!, name: String, email: String): User
deleteUser(id: ID!): User
}// server.js
const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const { buildSchema } = require('graphql');
const resolvers = require('./resolvers');
const schema = buildSchema(`
type User {
id: ID!
name: String!
email: String!
}
type Query {
users: [User]
user(id: ID!): User
}
type Mutation {
createUser(name: String!, email: String!): User
updateUser(id: ID!, name: String, email: String): User
deleteUser(id: ID!): User
}
`);
const app = express();
app.use('/graphql', graphqlHTTP({
schema: schema,
rootValue: resolvers,
graphiql: true,
}));
app.listen(4000, () => console.log('Server running on http://localhost:4000/graphql'));Conclusión
En esta sección, hemos aprendido cómo conectar un servidor GraphQL a una base de datos utilizando Sequelize. Hemos cubierto la configuración de la conexión, la definición de modelos, la realización de consultas y mutaciones, y el manejo de errores comunes. Con estos conocimientos, estás preparado para manejar datos en tu aplicación GraphQL de manera eficiente y segura.
En el próximo módulo, exploraremos estrategias avanzadas de obtención de datos y cómo optimizar el rendimiento de nuestras consultas.
Curso de GraphQL
Módulo 1: Introducción a GraphQL
- ¿Qué es GraphQL?
- GraphQL vs REST
- Configuración de un Servidor GraphQL
- Conceptos Básicos del Esquema de GraphQL
Módulo 2: Conceptos Fundamentales
Módulo 3: Diseño Avanzado de Esquemas
Módulo 4: Trabajando con Datos
Módulo 5: Rendimiento y Seguridad
Módulo 6: Herramientas y Ecosistema
Módulo 7: Pruebas y Despliegue
- Pruebas Unitarias de Resolvers
- Pruebas de Integración
- Integración Continua
- Despliegue de Servidores GraphQL
