Rutas y Controladores en Express.js

Aprende a estructurar tus aplicaciones Express.js para escalabilidad y mantenibilidad separando rutas y controladores.

🌐

¡Construyamos una app con Express! Empezamos con una solicitud entrante.

/* ¡Aparece una solicitud salvaje! */

Entendiendo las Rutas

En Express.js, una ruta define cómo responde la aplicación a una solicitud de un cliente a un punto final específico, que consiste en una URI (o ruta) y un método de solicitud HTTP específico (GET, POST, etc.). Las rutas son los puntos de entrada del backend de tu aplicación.

Introducción a los Controladores

Un controlador es una función que contiene la lógica de negocio para una ruta específica. En lugar de escribir toda la lógica dentro de la definición de la ruta, la separas en una función de controlador. Esto hace que tu código sea más limpio, más organizado y más fácil de probar y mantener.

Separación de Responsabilidades

El principio de Separación de Responsabilidades (SoC) es clave en el desarrollo de software. Al separar las rutas (que manejan el "qué" - el punto final) de los controladores (que manejan el "cómo" - la lógica), creas una estructura de aplicación modular y escalable. Esta es una piedra angular del patrón MVC (Modelo-Vista-Controlador).

El Rol del Middleware

Las funciones de Middleware son funciones que tienen acceso al objeto de solicitud (req), al objeto de respuesta (res) y a la función next en el ciclo de solicitud-respuesta de la aplicación. Pueden ejecutar código, realizar cambios en los objetos de solicitud y respuesta, finalizar el ciclo de solicitud-respuesta y llamar al siguiente middleware en la pila. A menudo se utilizan para tareas como autenticación, registro y análisis de cuerpos de solicitud.

Practice Zone


Test Interactivo 1: Relacionar Conceptos

Arrastra las descripciones a su concepto correcto de Express.js.

Arrastra en el orden correspondiente.


Arrastra las opciones:

Definen los puntos finales para las solicitudes de los clientes
Manejan la lógica de negocio para una ruta
Mejora la mantenibilidad del código

Completa el código:

Rutas______
Controladores______
Separación de Responsabilidades______
Unlock with Premium

Test Interactivo 2: Estructura del Código

Rellena los huecos en cada casilla.


// app.js
const express = require('express');
const app = express();
const userRoutes = require('./routes/user_routes');

app.use(express.json());
app.use('/api/users', );

const PORT = 3000;
app.listen(PORT, () => console.log(`Server on port ${PORT}`));

// routes/user_routes.js
const router = express.Router();
const userController = require('../controllers/user_controller');

router.get('/', userController.);
router.post('/', userController.);

module.exports = router;

// controllers/user_controller.js
exports.getAllUsers = (req, res) => {
  res.status(200).json({ message: 'Get all users' });
};

exports. = (req, res) => {
  res.status(201).json({ message: 'User created' });
};
Unlock with Premium

Ejemplo Práctico: Router de Productos

Crea una aplicación Express simple con un enrutador para productos. Define rutas para obtener y crear productos.

* Write the code below. Correct characters will be shown in green and incorrect ones in red.

// routes/productRoutes.js const express = require('express'); const router = express.Router(); // Controller logic directly in the route file (for simplicity) const getProducts = (req, res) => { res.json({ message: "List of products" }); }; const createProduct = (req, res) => { res.status(201).json({ message: "Product created" }); }; router.get('/products', getProducts); router.post('/products', createProduct); module.exports = router; // app.js const app = express(); const productRoutes = require('./routes/productRoutes.js'); app.use('/api', productRoutes); app.listen(3000, () => { console.log('Server is running on port 3000'); });
Unlock with Premium

Prueba de Conocimiento

¿Cuál es la principal ventaja de separar las rutas de los controladores?


Unlock with Premium

De la Teoría a la Producción

Estructurar tu aplicación Express con rutas y controladores es una buena práctica. Así es como se amortiza en un proyecto real.


1. Escalabilidad y Trabajo en Equipo

Cuando tu proyecto crezca, tendrás docenas de rutas. Separarlas en diferentes archivos (p. ej., `userRoutes.js`, `productRoutes.js`) y tener los controladores correspondientes hace que el código base sea manejable. Diferentes desarrolladores pueden trabajar en diferentes características sin causar conflictos.

2. Avanzado: Capa de Servicio

Para aplicaciones aún más complejas, muchos desarrolladores añaden una "Capa de Servicio". El trabajo del controlador es solo manejar la solicitud y respuesta HTTP. La capa de servicio maneja la lógica de negocio compleja (p. ej., llamar a múltiples modelos de base de datos, integrarse con APIs externas). Esto separa aún más las responsabilidades.

// Controlador
exports.createUser = async (req, res) => {
  const user = await UserService.create(req.body);
  res.status(201).json(user);
};

Conclusión práctica: Comienza siempre tus proyectos de Express separando rutas y controladores. Te prepara para un código base limpio, escalable y mantenible desde el primer día.

Glosario de Express.js

Router
Un objeto que te permite agrupar manejadores de rutas para una parte particular de tu sitio.
Controlador
Una función que contiene la lógica de negocio a ejecutar cuando se activa una ruta.
Middleware
Funciones que se ejecutan durante el ciclo de vida de una solicitud al servidor. Cada middleware tiene acceso a los objetos de solicitud y respuesta.
req (Request)
Un objeto que contiene información sobre la solicitud HTTP que generó el evento.
res (Response)
Un objeto que la aplicación Express utiliza para enviar la respuesta HTTP deseada.