Esta es una plantilla moderna para construir APIs REST usando Node.js, Express y TypeScript. Incluye una arquitectura modular, manejo centralizado de errores, validación de tipos, y buenas prácticas para desarrollo escalable.
rest-api-ts/
├── server.ts # 🚪 Punto de entrada principal
├── src/
│ ├── app.ts # 🧠 Configuración central de Express
│ ├── controllers/
│ │ └── userController.ts # 🎮 Lógica de negocio de usuarios
│ ├── models/
│ │ └── User.ts # 📝 Modelo e interfaz de datos
│ ├── routes/
│ │ ├── userRoutes.ts # 🛣️ Rutas de usuarios
│ │ └── healthRoute.ts # 🛣️ Ruta de salud del servidor
│ ├── middleware/
│ │ └── errorMiddleware.ts # 🛡️ Manejo centralizado de errores
├── .env # 🔒 Variables de entorno
├── package.json # 📦 Dependencias y scripts
├── tsconfig.json # ⚙️ Configuración de TypeScript
├── eslint.config.mts # 🔍 Configuración de ESLint
├── api.http # 🧪 Pruebas de endpoints
├── FLUJO_API_EXPLICACION.md # 📖 Documentación didáctica detallada
└── README.md # 📄 Este archivo
-
server.ts
: Punto de entrada que inicializa variables de entorno y arranca el servidor Express. -
src/app.ts
: Configuración central que aplica middlewares en orden crítico:- Seguridad (
helmet
) - Logging (
morgan
) - Parsing JSON (
express.json
,express.urlencoded
) - CORS
- Rutas (
/api/users
,/health
) - Manejo de errores
- Seguridad (
-
Rutas: Definidas en
src/routes/userRoutes.ts
ysrc/routes/healthRoute.ts
-
Controladores: Lógica de negocio en
src/controllers/userController.ts
-
Modelo: Acceso y validación de datos en
src/models/User.ts
(array en memoria) -
Respuesta: JSON estandarizado enviado al cliente
Método | Endpoint | Descripción | Body Requerido |
---|---|---|---|
GET | /health |
Estado del servidor | - |
GET | /api/users |
Obtener todos los usuarios | - |
GET | /api/users/:id |
Obtener usuario específico | - |
POST | /api/users |
Crear nuevo usuario | {name, email, age} |
PUT | /api/users/:id |
Actualizar usuario | {name?, email?, age?} |
DELETE | /api/users/:id |
Eliminar usuario | - |
- Node.js (v18 o superior)
- npm o yarn
- TypeScript (se instala como dependencia)
# Clona el repositorio
git clone <url-del-repo>
cd rest-api-ts
# Instala dependencias
npm install
Las variables de entorno ya están configuradas en .env
:
NODE_ENV=development
PORT=3000
FRONTEND_URL=http://localhost:3000
API_URL=http://localhost:3000/api
Desarrollo (recomendado):
# Ejecuta directamente con ts-node
npx ts-node server.ts
# O con scripts del package.json
npm run dev
Producción:
# Compila TypeScript a JavaScript
npm run build
# Ejecuta el código compilado
npm start
# Debería responder: {"success": true, "message": "Servidor OK"}
curl http://localhost:3000/health
Instala la extensión REST Client y usa el archivo api.http
:
✅ Verificar estado del servidor:
GET http://localhost:3000/health
📋 Obtener todos los usuarios:
GET http://localhost:3000/api/users
➕ Crear un nuevo usuario:
POST http://localhost:3000/api/users
Content-Type: application/json
{
"name": "Ana Martínez",
"email": "ana@email.com",
"age": 27
}
🔍 Obtener usuario específico:
GET http://localhost:3000/api/users/1
✏️ Actualizar usuario:
PUT http://localhost:3000/api/users/1
Content-Type: application/json
{
"name": "Juan Carlos Pérez",
"age": 26
}
🗑️ Eliminar usuario:
DELETE http://localhost:3000/api/users/1
El sistema implementa manejo de errores centralizado a través de src/middleware/errorMiddleware.ts
:
asyncHandler
: Captura automática de errores en funciones asyncnotFound
: Manejo de rutas no encontradas (404)errorHandler
: Formateo uniforme de respuestas de error
✅ Éxito:
{
"success": true,
"data": {...},
"count": 3
}
❌ Error:
{
"success": false,
"error": "Descripción del error",
"stack": "..." // Solo en desarrollo
}
Interfaz IUser (definida en src/models/User.ts
):
interface IUser {
id: number; // Autoincremental
name: string; // Nombre del usuario
email: string; // Email único
age: number; // Edad del usuario
createdAt: string; // Fecha de creación (ISO string)
}
// Array en memoria - se resetea al reiniciar el servidor
[
{ id: 1, name: "Juan Pérez", email: "juan@email.com", age: 25 },
{ id: 2, name: "María García", email: "maria@email.com", age: 30 },
{ id: 3, name: "Carlos López", email: "carlos@email.com", age: 28 },
];
⚠️ Importante: Los datos se almacenan en memoria y se pierden al reiniciar el servidor.
TypeScript (tsconfig.json
)
{
"compilerOptions": {
"target": "ES2020",
"module": "CommonJS",
"outDir": "./dist",
"rootDir": "./",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true
}
}
ESLint (eslint.config.mts
)
- Configurado con TypeScript ESLint
- Soporte para JSON y CSS
- Configuración para Node.js y Browser
npm run dev # Desarrollo con auto-reload
npm run build # Compilar TypeScript
npm start # Ejecutar versión compilada
npm run lint # Verificar código con ESLint
npm run lint:fix # Corregir errores de ESLint automáticamente
npm run type-check # Verificar tipos sin compilar
- JWT: Tokens de autenticación
- bcrypt: Hash de contraseñas
- express-rate-limit: Límite de peticiones
- express-validator: Validación avanzada
- PostgreSQL + Prisma: Para SQL con tipado
- MongoDB + Mongoose: Para NoSQL
- SQLite: Para desarrollo rápido
- Jest: Framework de testing
- Supertest: Testing de APIs HTTP
- @types/jest: Tipos para TypeScript
- Zod: Validación de esquemas con TypeScript
- Swagger/OpenAPI: Documentación automática
- class-validator: Validación basada en decoradores
- Compression: Compresión gzip
- Winston: Logging avanzado
- PM2: Process manager
- Docker: Containerización
- Separación de responsabilidades: Cada archivo tiene un propósito específico
- Tipado estático: TypeScript proporciona seguridad en tiempo de compilación
- Middleware pattern: Funciones reutilizables y configurables
- Centralizado: Un solo lugar para manejar todos los errores
- Consistente: Formato uniforme de respuestas
- Informativo: Stack traces en desarrollo, mensajes limpios en producción
- Recursos semánticos: URLs que representan entidades
- Métodos HTTP apropiados: GET, POST, PUT, DELETE
- Status codes estándar: 200, 201, 400, 404, 500
- Respuestas estructuradas: Formato JSON consistente
Para una explicación didáctica y visual completa del flujo de la API, consulta:
Este archivo incluye:
- Diagramas visuales del flujo de peticiones
- Ejemplos paso a paso
- Explicación detallada de cada componente
- Casos de uso prácticos
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature
) - Commit tus cambios (
git commit -m 'Add some AmazingFeature'
) - Push a la rama (
git push origin feature/AmazingFeature
) - Abre un Pull Request
ISC © Alejandro Gelormini
Este proyecto es un template educativo de código abierto. Siéntete libre de usarlo, modificarlo y distribuirlo.
Template creado para acelerar el desarrollo de APIs RESTful