Un proyecto completo de Node.js con TypeScript que implementa operaciones CRUD usando MySQL y TypeORM.
- Node.js con TypeScript
- MySQL como base de datos
- TypeORM para el mapeo objeto-relacional
- Jest para pruebas unitarias
- Docker Compose para el entorno de desarrollo
- Estructura de carpetas profesional
- CRUD completo para entidad
Task
database-crud/
├── src/
│ ├── db/
│ │ ├── config/
│ │ │ └── database.ts # Configuración de la base de datos
│ │ ├── entities/
│ │ │ └── Task.ts # Entidad Task con decoradores TypeORM
│ │ └── crud/
│ │ └── taskCrud.ts # Operaciones CRUD para Task
│ ├── tests/
│ │ └── task.test.ts # Pruebas unitarias
│ └── main.ts # Ejemplo de uso del CRUD
├── docker/
│ └── docker-compose.yml # Configuración de MySQL y phpMyAdmin
├── scripts/
│ └── init.sql # Script de inicialización de la BD
├── package.json # Dependencias y scripts
├── tsconfig.json # Configuración de TypeScript
└── README.md # Este archivo
- Node.js (v16 o superior)
- Docker y Docker Compose
- npm o yarn
# Clonar el repositorio
git clone <repository-url>
cd database-crud
# Instalar dependencias
npm install
# Copiar el archivo de ejemplo
cp env.example .env
# Editar las variables según tu configuración
nano .env
Variables de entorno disponibles:
DB_HOST=localhost
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=password
DB_DATABASE=ia
NODE_ENV=development
PORT=3000
cd docker
docker compose up -d
npm run dev
# Desarrollo
npm run dev # Ejecutar en modo desarrollo
npm run build # Compilar TypeScript
npm start # Ejecutar compilado
# Tests
npm test # Ejecutar tests
npm run test:watch # Tests en modo watch
# Base de datos
cd docker && docker compose up -d # Levantar MySQL
cd docker && docker compose down # Detener MySQL
interface Task {
id: number; // Primary Key, Auto Increment
title: string; // Título de la tarea
description: string; // Descripción (opcional)
completed: boolean; // Estado de completado
created_at: Date; // Fecha de creación
updated_at: Date; // Fecha de última actualización
}
const taskCrud = new TaskCrud();
const newTask = await taskCrud.create({
title: 'Mi Nueva Tarea',
description: 'Descripción de la tarea',
completed: false
});
// Obtener todas las tareas
const allTasks = await taskCrud.findAll();
// Obtener una tarea por ID
const task = await taskCrud.findOne(1);
// Obtener tareas por estado
const completedTasks = await taskCrud.findByCompletionStatus(true);
const updatedTask = await taskCrud.update(1, {
title: 'Título Actualizado',
completed: true
});
// Marcar como completada
await taskCrud.markAsCompleted(1);
// Marcar como incompleta
await taskCrud.markAsIncomplete(1);
const deleted = await taskCrud.remove(1);
const totalCount = await taskCrud.count();
const completedCount = await taskCrud.countCompleted();
const incompleteCount = await taskCrud.countIncomplete();
El proyecto incluye pruebas unitarias completas que cubren:
- ✅ Creación de tareas
- ✅ Lectura de tareas (todas, por ID, por estado)
- ✅ Actualización de tareas
- ✅ Eliminación de tareas
- ✅ Operaciones de marcado (completada/incompleta)
- ✅ Conteo de tareas
- ✅ Manejo de errores
# Ejecutar solo las pruebas de TaskCrud
npm test -- --testNamePattern="TaskCrud"
# Ejecutar pruebas con verbose output
npm test -- --verbose
# Comandos básicos
cd docker
docker compose up -d # Levantar
docker compose down # Detener
docker compose logs -f # Ver logs
# Acceso a MySQL
docker exec -it database-crud-mysql mysql -u root -p
Script | Descripción |
---|---|
npm run dev |
Desarrollo con ts-node |
npm run build |
Compilar TypeScript |
npm start |
Ejecutar compilado |
npm test |
Ejecutar tests |
npm run test:watch |
Tests en modo watch |
npm run dev # Ejecuta demo completo de CRUD
src/
├── db/
│ ├── entities/ # Entidades TypeORM
│ ├── config/ # Configuración BD
│ └── crud/ # Operaciones CRUD
├── tests/ # Pruebas unitarias
└── main.ts # Ejemplo de uso
# MySQL no inicia
cd docker && docker compose down && docker compose up -d
# Puerto ocupado
sudo lsof -i :3306
# Tests fallan
docker exec -i database-crud-mysql mysql -u root -ppassword -e "CREATE DATABASE IF NOT EXISTS ia_test;"
MIT License
¡Listo para usar! 🎉