Appearance
Archivo app.ts
El archivo src/app.ts es el punto de entrada principal de tu aplicación Express. Aquí es donde se inicializa la instancia de Express, se configuran los middlewares globales (como CORS, body-parser, rate limiting y logging) y se montan todas las rutas de la API. Esencialmente, app.ts actúa como el cerebro de tu servidor, definiendo cómo las solicitudes entrantes son procesadas y dirigidas a sus respectivas lógicas de negocio.
- Descripción: app.ts configura tu aplicación Express para manejar solicitudes HTTP. Importa y utiliza middlewares para habilitar la lectura de JSON, la seguridad de CORS, el registro de solicitudes (Morgan), la limitación de tasas (Rate Limit) y la documentación de la API (Swagger). Además, conecta las rutas específicas de usuarios, estudiantes y autenticación con sus respectivos prefijos de URL, y finaliza con un middleware global para el manejo centralizado de errores.
- Propósito: Configurar y arrancar el servidor Express, integrando todos los componentes necesarios para que la API funcione correctamente. Su rol es preparar el entorno de la aplicación para recibir y procesar las solicitudes de los clientes de manera eficiente y segura.
- Funcionalidad:
- Importaciones iniciales: Carga variables de entorno (dotenv), express, cors, los enrutadores de tu aplicación (userRoute, studentRoute, authRoute), el middleware de manejo de errores, express-rate-limit, Swagger para la documentación y Morgan para el logging.
- const app = express();: Crea la instancia principal de la aplicación Express.
- app.use(morgan("dev"));: Configura Morgan como un middleware de logging. El formato "dev" es conciso y colorido, ideal para el desarrollo, mostrando información como el método HTTP, la URL, el código de estado y el tiempo de respuesta.
- Configuración CORS:
- Define corsOptions utilizando variables de entorno (CORS_ORIGIN, CORS_METHODS, CORS_HEADERS) para especificar qué orígenes, métodos HTTP y cabeceras están permitidos para las solicitudes de origen cruzado.
- app.use(cors(corsOptions));: Aplica el middleware CORS con las opciones configuradas, asegurando que solo los clientes autorizados puedan interactuar con tu API.
- Documentación API (Swagger):
- app.use("/api-docs", swaggerUi.serve, swaggerUi.setup(openapiSpecification));: Configura un endpoint (/api-docs) para servir la documentación interactiva de la API generada con Swagger UI, utilizando la especificación OpenAPI definida en openapiSpecification.
- app.use(express.json());: Habilita el middleware body-parser de Express para analizar los cuerpos de las solicitudes entrantes con formato JSON, haciendo que los datos enviados en el cuerpo de una petición POST o PUT/PATCH estén disponibles en req.body.
- Limitador de Tasas (Rate Limiter):
- Define limiter con express-rate-limit
- windowMs: 15 _ 60 _ 1000 (15 minutos): El período de tiempo para el que se rastrean las solicitudes.
- max: 100: El número máximo de solicitudes permitidas por IP dentro de windowMs.
- message: Mensaje de error personalizado si se excede el límite.
- standardHeaders: true y legacyHeaders: false: Configuran las cabeceras HTTP para informar sobre el límite de tasa.
- app.use(limiter);: Aplica el limitador de tasas globalmente a todas las rutas, protegiendo la API de ataques de fuerza bruta o abuso excesivo.
- Define limiter con express-rate-limit
- Montaje de Rutas:
- app.use("/api/auth", authRoute);: Asocia todas las rutas definidas en authRoute bajo el prefijo /api/auth.
- app.use("/api/users", userRoute);: Asocia todas las rutas definidas en userRoute bajo el prefijo /api/users.
- app.use("/api/students", studentRoute);: Asocia todas las rutas definidas en studentRoute bajo el prefijo /api/students.
- Manejo de Errores Centralizado:
- app.use(httpErrorHandle);: Configura el middleware httpErrorHandle como el manejador de errores global. Cualquier error lanzado por las rutas o middlewares anteriores será capturado y procesado por este middleware, que luego enviará una respuesta HTTP adecuada al cliente. Es importante que este middleware se aplique después de todas las rutas y otros middlewares que puedan generar errores.
- Rol en la aplicación: Es el orquestador principal que une todas las partes de la aplicación. Define la estructura de la API, las políticas de seguridad y la forma en que se manejan las interacciones HTTP, proporcionando una base sólida para el funcionamiento de todo el backend.
ts
import "dotenv/config"; // Carga las variables de entorno desde el archivo .env
import express from "express"; // Importa la librería Express
import cors from "cors"; // Importa el middleware CORS para control de acceso de origen cruzado
import userRoute from "./routes/user.route"; // Importa las rutas relacionadas con los usuarios
import studentRoute from "./routes/student.route"; // Importa las rutas relacionadas con los estudiantes
import authRoute from "./routes/auth.route"; // Importa las rutas relacionadas con la autenticación
import { httpErrorHandle } from "./middlewares/http.error.handle.middleware"; // Importa el middleware de manejo de errores HTTP
import rateLimit from "express-rate-limit"; // Importa el middleware para limitar la tasa de solicitudes
import openapiSpecification from "./config/swagger"; // Importa la especificación OpenAPI para Swagger
import swaggerUi from "swagger-ui-express"; // Importa la interfaz de usuario de Swagger
import morgan from "morgan"; // Importa Morgan para el logging de solicitudes HTTP
// Crea una instancia de la aplicación Express
const app = express();
// Configura Morgan como middleware de logging.
// "dev" es un formato predefinido que proporciona una salida concisa y coloreada, ideal para el desarrollo.
app.use(morgan("dev"));
// Configura las opciones para el middleware CORS.
// Los valores se obtienen de las variables de entorno para mayor flexibilidad y seguridad.
const corsOptions = {
origin: process.env.CORS_ORIGIN, // Define los orígenes permitidos (ej. "http://localhost:3000")
methods: process.env.CORS_METHODS?.split(","), // Define los métodos HTTP permitidos (ej. "GET,POST,PUT,DELETE")
allowedHeaders: process.env.CORS_HEADERS?.split(","), // Define las cabeceras HTTP permitidas
};
// Aplica el middleware CORS a la aplicación Express.
app.use(cors(corsOptions));
// Configura el endpoint para la documentación interactiva de la API con Swagger UI.
// Las rutas /api-docs servirán la interfaz de Swagger basada en la especificación OpenAPI.
app.use("/api-docs", swaggerUi.serve, swaggerUi.setup(openapiSpecification));
// Habilita el middleware de Express para parsear cuerpos de solicitudes en formato JSON.
// Esto permite que la aplicación reciba y entienda datos JSON enviados en peticiones POST/PUT/PATCH.
app.use(express.json());
// Configura el limitador de tasas (Rate Limiter) para proteger la API contra abusos.
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // La ventana de tiempo para el límite (15 minutos en milisegundos)
max: 100, // El número máximo de solicitudes permitidas por IP dentro de la ventana de tiempo
message:
"Demasiadas solicitudes desde esta IP, por favor inténtalo más tarde.", // Mensaje de error cuando se excede el límite
standardHeaders: true, // Incluye cabeceras de límite de tasa estándar (RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset)
legacyHeaders: false, // Deshabilita las cabeceras X-Rate-Limit-* antiguas
});
// Aplica el limitador de tasas a todas las solicitudes que llegan a la aplicación.
app.use(limiter);
// Configura las rutas principales de la API.
// Cada "app.use" monta un enrutador específico bajo un prefijo de URL.
app.use("/api/auth", authRoute); // Rutas de autenticación (ej. /api/auth/login)
app.use("/api/users", userRoute); // Rutas para la gestión de usuarios (ej. /api/users/)
app.use("/api/students", studentRoute); // Rutas para la gestión de estudiantes (ej. /api/students/)
// Aplica el middleware de manejo de errores HTTP.
// Este middleware se coloca al final para que capture cualquier error
// que ocurra en los middlewares o rutas anteriores.
app.use(httpErrorHandle);
// Exporta la instancia de la aplicación Express para que pueda ser importada y utilizada
// en el archivo que inicia el servidor (normalmente server.ts o index.ts).
export default app;