El enrutamiento en Express.js es una de las características más importantes y poderosas del framework. Permite definir cómo una aplicación responde a una solicitud de cliente en una URL específica, con un método HTTP específico (GET, POST, etc.). En esta sección, aprenderás cómo configurar rutas en Express y cómo manejar diferentes tipos de solicitudes.
Conceptos Clave
- Rutas Básicas: Definición de rutas simples que responden a solicitudes HTTP.
- Parámetros de Ruta: Captura de valores dinámicos en la URL.
- Rutas Anidadas: Organización de rutas en subrutas para una mejor estructura.
- Manejo de Errores en Rutas: Cómo manejar errores en las rutas.
Rutas Básicas
Las rutas en Express se definen utilizando métodos específicos del objeto app
(como app.get
, app.post
, etc.). Aquí tienes un ejemplo básico:
const express = require('express'); const app = express(); const port = 3000; // Ruta GET básica app.get('/', (req, res) => { res.send('¡Hola, Mundo!'); }); // Ruta POST básica app.post('/submit', (req, res) => { res.send('Formulario enviado'); }); app.listen(port, () => { console.log(`Servidor escuchando en http://localhost:${port}`); });
Explicación del Código
app.get('/', (req, res) => { ... })
: Define una ruta que responde a solicitudes GET en la URL raíz (/
).app.post('/submit', (req, res) => { ... })
: Define una ruta que responde a solicitudes POST en la URL/submit
.app.listen(port, () => { ... })
: Inicia el servidor y lo hace escuchar en el puerto especificado.
Parámetros de Ruta
Los parámetros de ruta permiten capturar valores dinámicos en la URL. Se definen utilizando dos puntos (:
) seguidos del nombre del parámetro.
// Ruta con parámetro de ruta app.get('/user/:id', (req, res) => { const userId = req.params.id; res.send(`Usuario ID: ${userId}`); });
Explicación del Código
app.get('/user/:id', (req, res) => { ... })
: Define una ruta que captura el parámetroid
de la URL.req.params.id
: Accede al valor del parámetroid
en la solicitud.
Rutas Anidadas
Para organizar mejor las rutas, puedes utilizar el objeto express.Router()
. Esto permite definir subrutas y agruparlas lógicamente.
const userRouter = express.Router(); // Subruta para obtener información del usuario userRouter.get('/:id', (req, res) => { const userId = req.params.id; res.send(`Información del usuario con ID: ${userId}`); }); // Subruta para actualizar información del usuario userRouter.put('/:id', (req, res) => { const userId = req.params.id; res.send(`Actualizando usuario con ID: ${userId}`); }); // Montar el router en la aplicación principal app.use('/user', userRouter);
Explicación del Código
const userRouter = express.Router()
: Crea un nuevo router.userRouter.get('/:id', (req, res) => { ... })
: Define una subruta GET en el router.userRouter.put('/:id', (req, res) => { ... })
: Define una subruta PUT en el router.app.use('/user', userRouter)
: Monta el router en la aplicación principal bajo la ruta/user
.
Manejo de Errores en Rutas
Es importante manejar errores en las rutas para proporcionar una mejor experiencia de usuario y depuración.
app.get('/error', (req, res, next) => { const err = new Error('Algo salió mal'); err.status = 500; next(err); }); // Middleware de manejo de errores app.use((err, req, res, next) => { res.status(err.status || 500); res.send({ error: { message: err.message } }); });
Explicación del Código
const err = new Error('Algo salió mal')
: Crea un nuevo objeto de error.next(err)
: Pasa el error al siguiente middleware.app.use((err, req, res, next) => { ... })
: Middleware de manejo de errores que responde con el mensaje de error y el estado HTTP.
Ejercicio Práctico
Ejercicio
- Crea una aplicación Express que tenga las siguientes rutas:
GET /
: Responde con "Página de inicio".GET /about
: Responde con "Acerca de nosotros".GET /user/:name
: Responde con "Hola, [name]".POST /contact
: Responde con "Formulario de contacto enviado".
Solución
const express = require('express'); const app = express(); const port = 3000; app.get('/', (req, res) => { res.send('Página de inicio'); }); app.get('/about', (req, res) => { res.send('Acerca de nosotros'); }); app.get('/user/:name', (req, res) => { const userName = req.params.name; res.send(`Hola, ${userName}`); }); app.post('/contact', (req, res) => { res.send('Formulario de contacto enviado'); }); app.listen(port, () => { console.log(`Servidor escuchando en http://localhost:${port}`); });
Retroalimentación
- Error Común: Olvidar definir el método HTTP correcto (GET, POST, etc.) para cada ruta.
- Solución: Asegúrate de usar
app.get
,app.post
, etc., según corresponda.
- Solución: Asegúrate de usar
- Consejo: Utiliza
express.Router()
para organizar mejor las rutas en aplicaciones más grandes.
Conclusión
En esta sección, has aprendido cómo definir y manejar rutas en Express.js, incluyendo rutas básicas, parámetros de ruta, rutas anidadas y manejo de errores. Estas habilidades son fundamentales para construir aplicaciones web robustas y bien estructuradas con Express. En el próximo módulo, exploraremos cómo trabajar con bases de datos y ORMs en Node.js.
Curso de Node.js
Módulo 1: Introducción a Node.js
Módulo 2: Conceptos Básicos
Módulo 3: Sistema de Archivos y E/S
Módulo 4: HTTP y Servidores Web
- Creando un Servidor HTTP Simple
- Manejo de Solicitudes y Respuestas
- Sirviendo Archivos Estáticos
- Enrutamiento
Módulo 5: NPM y Gestión de Paquetes
- Introducción a NPM
- Instalación y Uso de Paquetes
- Creación y Publicación de Paquetes
- Versionado Semántico
Módulo 6: Framework Express.js
- Introducción a Express.js
- Configuración de una Aplicación Express
- Middleware
- Enrutamiento en Express
- Manejo de Errores
Módulo 7: Bases de Datos y ORMs
- Introducción a las Bases de Datos
- Usando MongoDB con Mongoose
- Usando Bases de Datos SQL con Sequelize
- Operaciones CRUD
Módulo 8: Autenticación y Autorización
- Introducción a la Autenticación
- Usando Passport.js
- Autenticación JWT
- Control de Acceso Basado en Roles
Módulo 9: Pruebas y Depuración
- Introducción a las Pruebas
- Pruebas Unitarias con Mocha y Chai
- Pruebas de Integración
- Depuración de Aplicaciones Node.js
Módulo 10: Temas Avanzados
- Módulo Cluster
- Hilos de Trabajo
- Optimización del Rendimiento
- Construcción de APIs RESTful
- GraphQL con Node.js
Módulo 11: Despliegue y DevOps
- Variables de Entorno
- Usando PM2 para la Gestión de Procesos
- Desplegando en Heroku
- Integración y Despliegue Continuos