Express

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.

Aprende Express GRATIS y certifícate

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.

Aprende Express GRATIS online

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

Ver todos los módulos de Express

Otras tecnologías

Acceder a todas las tecnologías