Curso de programación con Express
Express es el framework minimalista para Node.js, ideal para crear aplicaciones web y APIs rápidas. Aprende a desarrollar con Express.
Express.js es el framework web más utilizado para Node.js, diseñado para construir aplicaciones web y APIs de forma rápida y eficiente. Su filosofía minimalista y flexible lo convierte en la base de miles de aplicaciones web modernas, desde pequeños proyectos hasta aplicaciones empresariales de gran escala.
¿Qué es Express.js?
Express.js es un framework web minimalista que proporciona un conjunto robusto de características para aplicaciones web y móviles. Construido sobre Node.js, Express simplifica el proceso de creación de servidores web al ofrecer una capa de abstracción sobre las funcionalidades básicas de HTTP de Node.js.
La principal ventaja de Express radica en su simplicidad y flexibilidad. No impone una estructura rígida, permitiendo a los desarrolladores organizar su código según las necesidades específicas del proyecto. Esta característica lo diferencia de otros frameworks más opinionados y lo convierte en una excelente opción tanto para principiantes como para desarrolladores experimentados.
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('¡Hola mundo con Express!');
});
app.listen(3000, () => {
console.log('Servidor ejecutándose en puerto 3000');
});
Arquitectura y conceptos fundamentales
Express se basa en varios conceptos fundamentales que forman la base de cualquier aplicación web construida con este framework. El más importante es el concepto de routing, que permite definir cómo la aplicación responde a diferentes solicitudes del cliente hacia endpoints específicos.
Un endpoint se define por una ruta específica y un método HTTP (GET, POST, PUT, DELETE, etc.). Esta combinación determina qué función se ejecutará cuando un cliente realice una solicitud particular.
// Diferentes rutas para diferentes operaciones
app.get('/usuarios', obtenerUsuarios); // Obtener lista de usuarios
app.post('/usuarios', crearUsuario); // Crear nuevo usuario
app.put('/usuarios/:id', actualizarUsuario); // Actualizar usuario específico
app.delete('/usuarios/:id', eliminarUsuario); // Eliminar usuario
El sistema de middleware constituye otro pilar fundamental de Express. Los middlewares son funciones que se ejecutan durante el ciclo de vida de una solicitud HTTP, permitiendo procesar, validar, autenticar o modificar tanto las solicitudes entrantes como las respuestas salientes.
Gestión de solicitudes y respuestas
Express proporciona objetos request y response enriquecidos que extienden las funcionalidades básicas de Node.js. El objeto request contiene información sobre la solicitud HTTP, incluyendo parámetros, query strings, headers y el cuerpo de la solicitud.
app.get('/productos/:categoria', (req, res) => {
const categoria = req.params.categoria; // Parámetro de ruta
const limite = req.query.limite; // Query parameter
const userAgent = req.get('User-Agent'); // Header HTTP
// Lógica de procesamiento
res.json({
categoria,
limite,
userAgent,
productos: []
});
});
El objeto response ofrece múltiples métodos para enviar respuestas al cliente, desde texto plano hasta JSON estructurado, archivos estáticos o plantillas renderizadas. Express maneja automáticamente muchos aspectos de las respuestas HTTP, como la configuración de headers apropiados y códigos de estado.
Middleware: El corazón de Express
Los middlewares representan el mecanismo más potente de Express para procesar solicitudes. Funcionan como una cadena de funciones que se ejecutan secuencialmente, donde cada middleware puede modificar los objetos request y response, ejecutar código, finalizar el ciclo request-response, o pasar el control al siguiente middleware.
// Middleware de logging
app.use((req, res, next) => {
console.log(`${req.method} ${req.path} - ${new Date().toISOString()}`);
next(); // Pasa el control al siguiente middleware
});
// Middleware de autenticación
app.use('/api/privada', (req, res, next) => {
const token = req.headers.authorization;
if (!token) {
return res.status(401).json({ error: 'Token requerido' });
}
// Validar token...
next();
});
Express incluye varios middlewares integrados para tareas comunes como servir archivos estáticos, parsear JSON, o manejar datos de formularios. También existe un ecosistema extenso de middlewares de terceros que añaden funcionalidades específicas como autenticación, logging avanzado, compresión, o protección contra ataques comunes.
Integración con bases de datos
Las aplicaciones Express frecuentemente necesitan persistir datos, y el framework se integra perfectamente con diferentes sistemas de bases de datos. Para bases de datos relacionales como MySQL o PostgreSQL, Express puede utilizar drivers nativos o ORMs como Sequelize que simplifican las operaciones de base de datos.
// Conexión básica con MySQL
const mysql = require('mysql2');
const connection = mysql.createConnection({
host: 'localhost',
user: 'usuario',
password: 'contraseña',
database: 'mi_aplicacion'
});
app.get('/usuarios', async (req, res) => {
try {
const [usuarios] = await connection.promise().execute(
'SELECT id, nombre, email FROM usuarios'
);
res.json(usuarios);
} catch (error) {
res.status(500).json({ error: 'Error al obtener usuarios' });
}
});
Para bases de datos NoSQL como MongoDB, Express se combina comúnmente con Mongoose, un ODM (Object Document Mapper) que proporciona una capa de abstracción elegante sobre MongoDB, incluyendo validación de esquemas, casting de tipos, y hooks de middleware.
Seguridad y autenticación
La seguridad es un aspecto crítico en cualquier aplicación web, y Express proporciona las herramientas necesarias para implementar sistemas de autenticación y autorización robustos. Esto incluye el hash seguro de contraseñas, generación y validación de tokens JWT, y middlewares de protección contra vulnerabilidades comunes.
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
// Registro de usuario con hash de contraseña
app.post('/registro', async (req, res) => {
const { email, password } = req.body;
// Hash de la contraseña
const saltRounds = 12;
const hashedPassword = await bcrypt.hash(password, saltRounds);
// Guardar usuario en base de datos
// ...
res.status(201).json({ mensaje: 'Usuario creado exitosamente' });
});
// Login con generación de token
app.post('/login', async (req, res) => {
const { email, password } = req.body;
// Verificar credenciales
const usuario = await obtenerUsuarioPorEmail(email);
const passwordValido = await bcrypt.compare(password, usuario.password);
if (passwordValido) {
const token = jwt.sign(
{ userId: usuario.id, email: usuario.email },
process.env.JWT_SECRET,
{ expiresIn: '24h' }
);
res.json({ token });
} else {
res.status(401).json({ error: 'Credenciales inválidas' });
}
});
Manejo de archivos y contenido estático
Express facilita el manejo de archivos tanto estáticos como dinámicos. Para archivos estáticos como CSS, JavaScript, imágenes, o documentos, Express proporciona middleware integrado que los sirve eficientemente. Para uploads de archivos, librerías como Multer se integran perfectamente con Express.
// Servir archivos estáticos
app.use('/public', express.static('public'));
// Configuración de Multer para uploads
const multer = require('multer');
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, 'uploads/');
},
filename: (req, file, cb) => {
const uniqueName = Date.now() + '-' + file.originalname;
cb(null, uniqueName);
}
});
const upload = multer({
storage,
fileFilter: (req, file, cb) => {
// Validar tipo de archivo
if (file.mimetype.startsWith('image/')) {
cb(null, true);
} else {
cb(new Error('Solo se permiten imágenes'), false);
}
}
});
app.post('/upload', upload.single('imagen'), (req, res) => {
res.json({
mensaje: 'Archivo subido exitosamente',
archivo: req.file.filename
});
});
Gestión de errores y debugging
Un manejo de errores efectivo es crucial para aplicaciones robustas. Express proporciona mecanismos integrados para capturar y procesar errores, incluyendo middleware especializado para gestión de errores que se ejecuta cuando ocurre una excepción no manejada.
// Middleware de manejo de errores
app.use((error, req, res, next) => {
console.error('Error:', error.message);
// Respuesta según el tipo de error
if (error.name === 'ValidationError') {
res.status(400).json({ error: 'Datos de entrada inválidos' });
} else if (error.name === 'UnauthorizedError') {
res.status(401).json({ error: 'Acceso no autorizado' });
} else {
res.status(500).json({ error: 'Error interno del servidor' });
}
});
Escalabilidad y rendimiento
Express está diseñado para escalar desde aplicaciones simples hasta sistemas complejos. Su arquitectura modular permite añadir funcionalidades según las necesidades crecen, mientras que su rendimiento eficiente lo hace adecuado para aplicaciones de alto tráfico.
La modularización es clave en aplicaciones Express grandes. Separar rutas, middlewares, y lógica de negocio en módulos independientes facilita el mantenimiento y permite que equipos trabajen en paralelo en diferentes componentes de la aplicación.
// Estructura modular de rutas
const usuariosRouter = require('./routes/usuarios');
const productosRouter = require('./routes/productos');
const authRouter = require('./routes/auth');
app.use('/api/usuarios', usuariosRouter);
app.use('/api/productos', productosRouter);
app.use('/api/auth', authRouter);
Express se ha consolidado como el estándar de facto para desarrollo web en Node.js debido a su equilibrio perfecto entre simplicidad y funcionalidad. Su ecosistema maduro, documentación extensa, y comunidad activa lo convierten en una elección segura para proyectos de cualquier escala, desde prototipos rápidos hasta aplicaciones empresariales críticas.
Tutoriales de Express
Aprende Express con tutoriales de programación en Express.
Ejercicios de programación de Express
Evalúa tus conocimientos en Express con ejercicios de programación Express de tipo Test, Puzzle, Código y Proyecto con VSCode.
Tipo de tecnología
Framework
Categoría laboral
Backend
Año de lanzamiento
2010
Developers
Holowaychuk, IBM
Todos los módulos del curso de Express
Express
Introducción y entorno
Express
Routing
Express
Middleware
Express
Database
Express
Seguridad
Express
File System
Otras tecnologías
C
C
Backend
Lenguaje de propósito general, eficiente y de bajo nivel.
Rust
Rust
Backend
Lenguaje de programación de sistemas enfocado en seguridad, concurrencia y rendimiento.
R
R
Ciencia de Datos e IA
Lenguaje para análisis estadístico, manipulación de datos y visualización gráfica.
TypeScript
TypeScript
Full Stack
Superconjunto de JavaScript con tipado estático.
Go
Go
Backend
Lenguaje de programación eficiente y concurrente creado por Google.
Hibernate
Hibernate
Backend
ORM para Java, simplifica el acceso a bases de datos.