Introducción
A medida que tu API crece más allá de unos pocos endpoints, volcar todo en un único archivo se vuelve ingobernable muy rápido. Express te ofrece una herramienta integrada llamada Router para dividir las rutas en módulos separados por recurso. Combínalo con una capa de controladores y obtendrás una estructura que escala de forma limpia: los nuevos miembros del equipo encuentran lo que necesitan, y añadir un recurso nuevo no obliga a modificar el código existente.
Esta lección recorre una disposición de proyecto concreta: las rutas definen los patrones de URL y los verbos HTTP, los controladores contienen la lógica de los handlers, y app.js los conecta. Esa separación es el hábito más importante que debes adquirir desde el principio.
Estructura del Proyecto
Esta es la disposición de directorios hacia la que vamos a construir:
El patrón es simple: un archivo de rutas por recurso, un archivo de controladores por recurso. Las rutas se mantienen delgadas — solo declaran qué función del controlador gestiona cada endpoint. Los controladores se mantienen enfocados — solo contienen la lógica de request/response de su recurso.
Express Router
Express Router crea una mini-aplicación que gestiona rutas de forma independiente; luego la montas en una ruta dentro de app.js.
Comencemos con el archivo de rutas de usuarios:
Observa que las rutas usan paths relativos como / y /:id, no /users ni /users/:id. El prefijo se añade cuando montas el router en app.js, así nunca te repites.
Montando el router en app.js:
Una petición GET a /users/42 ahora se resuelve en router.get('/:id', ...) con req.params.id igual a '42'. Limpio y predecible.
Controladores
Los controladores son módulos simples que exportan funciones con nombre. Cada función es un handler estándar de Express: recibe req y res (y opcionalmente next) y se encarga de enviar la respuesta.
Hay varias cosas que vale la pena destacar aquí. El controlador valida la entrada y retorna pronto con un código de estado apropiado cuando algo falla — esto mantiene el camino feliz legible. La comprobación 404 es intencional: no asumas que un registro existe. Y un 204 No Content sin body es la respuesta convencional para un borrado exitoso.
Errores Comunes
Olvidar parsear los cuerpos JSON de las peticiones es el problema más habitual entre principiantes. Sin app.use(express.json()) en app.js, req.body será undefined y createUser o updateUser recibirán silenciosamente nada.
Otra trampa es comparar req.params.id (un string) directamente con un id numérico usando igualdad estricta. La comprobación users.find(u => u.id === req.params.id) siempre fallará porque '42' !== 42. Usa parseInt o Number() para convertir primero.
Por último, no retornar después de enviar una respuesta provoca el error 'Cannot set headers after they are sent'. Usa siempre return res.status(404).json(...) — el return evita que Express continúe a la siguiente línea e intente enviar una segunda respuesta.
Resumen
Express Router te permite agrupar rutas relacionadas en sus propios módulos y montarlos en un prefijo dentro de app.js. Los controladores mantienen la lógica de los handlers fuera de los archivos de rutas, haciendo que cada capa sea más fácil de leer, testear y extender. El patrón es: el archivo de rutas declara la URL y el verbo, la función del controlador gestiona la lógica y envía la respuesta. Apégate a un archivo por recurso y aguantará bien a medida que el proyecto crezca.
Punto de control de la lección
Repasa lo aprendido y recibe comentarios sobre tu trabajo.