API REST con Express + middlewares

Implementa una API REST con Express usando middlewares, validación de entrada y manejo centralizado de errores.

Express acelera el desarrollo de APIs, pero no sustituye el criterio arquitectúnico.

La calidad de una API depende de cómo validas entrada y gestionas errores.

Separar rutas, controladores y servicios evita el archivo gigante anti-mantenimiento.

Meta: montar una API REST limpia y lista para crecer.

  • Evita mezclar routing, negocio y persistencia.
  • `routes/`: define endpoints.
  • `controllers/`: traduce HTTP a casos de uso.
  • `services/`: reglas de negocio.
  • `middlewares/`: validación, auth, logging.

Estructura recomendada para Express

Evita mezclar routing, negocio y persistencia.

  • `routes/`: define endpoints.
  • `controllers/`: traduce HTTP a casos de uso.
  • `services/`: reglas de negocio.
  • `middlewares/`: validación, auth, logging.

Flujo de middlewares

Cada middleware debe tener una responsabilidad clara.

Manejo centralizado de errores

Sin middleware de error, cada endpoint termina improvisando.

Conexión con autenticación

Una API real necesita control de acceso.

JavaScript
56

API REST con Express + middlewares

Implementa una API REST con Express usando middlewares, validación de entrada y manejo centralizado de errores.

Código del tema: express() | app.use | req/res/next

📘 Teoría

Estructura recomendada para Express

Evita mezclar routing, negocio y persistencia.

  • `routes/`: define endpoints.
  • `controllers/`: traduce HTTP a casos de uso.
  • `services/`: reglas de negocio.
  • `middlewares/`: validación, auth, logging.

Flujo de middlewares

Cada middleware debe tener una responsabilidad clara.

Validación previa de payload
app.post('/users', (req, res, next) => {
  if (!req.body.email) {
    return res.status(400).json({ error: 'email requerido' });
  }
  next();
}, createUserController);

Manejo centralizado de errores

Sin middleware de error, cada endpoint termina improvisando.

Error handler global
app.use((err, req, res, next) => {
  console.error(err);
  res.status(err.status || 500).json({
    error: err.message || 'Error interno'
  });
});

Conexión con autenticación

Una API real necesita control de acceso.

🧪 Aprende probando

Ejemplo Ejemplo guiado: flujo mínimo funcional Construye una versión simple y verifica salidas en consola.
Ejemplo Ejemplo guiado: iterar y registrar estado Patrón útil para depuración incremental.
Ejemplo Demo interactiva: mini laboratorio Interactúa con la UI y observa cambios en preview y consola.

🏁 Retos

Reto Reto 1: transformación controlada Crea una variable `resultado` transformando un valor de entrada y muéstrala en consola.
Reto Reto 2: función reutilizable Encapsula la lógica en una función para reutilizarla.

¿Qué es esto?

Soy Cristian Eslava y a veces hago webs para procrastinar yo y vosotros 😉.

Esta la hice en febrero de 2026 para facilitar el aprendizaje de mis alumnxs. Aprender desarrollo web practicando. La idea es que crezca semanalmente con nuevos temas, tests y retos.

Inspirado en MDN, en W3Schools, en Codepen, en el crack de Manz y en mil sitios de documentación sobre desarrollo web. Quería aportar además de bloques teóricos con ejemplos, la gamificación de los retos y el sistema de test que ya tenía en culTest .

Si te gustó, si no te gustó, si quieres saludarme, o invitarme a 🍻 no dudes en escribirme en cristianeslava@gmail.com .