Middleware Populares de Express.js

Express.js tiene una gran variedad de middleware disponibles. Aquí tienes los más importantes y utilizados:

Built-in Middleware (Incorporados)

  • express.json() - Parsea el cuerpo de las peticiones JSON
  • express.urlencoded() - Parsea datos de formularios HTML
  • express.static() - Sirve archivos estáticos (CSS, JS, imágenes)

Third-party Middleware (De terceros)

  • morgan - Registra información detallada de las peticiones HTTP
  • helmet - Añade headers de seguridad para proteger la aplicación
  • cors - Maneja Cross-Origin Resource Sharing (peticiones desde otros dominios)
  • express-rate-limit - Limita el número de peticiones por IP
  • serve-favicon - Sirve el archivo favicon.ico de forma eficiente

Ejemplo Completo con Middleware Populares


javascript
const express = require('express');
const morgan = require('morgan');           // npm install morgan
const helmet = require('helmet');           // npm install helmet  
const cors = require('cors');               // npm install cors
const rateLimit = require('express-rate-limit'); // npm install express-rate-limit
const favicon = require('serve-favicon');   // npm install serve-favicon
const path = require('path');

const app = express();

// 1. HELMET - Middleware de seguridad (debe ir primero)
app.use(helmet());
console.log('Helmet activado - Headers de seguridad configurados');

// 2. MORGAN - Logging de peticiones
app.use(morgan('combined')); // Formato: IP - usuario [fecha] "método URL HTTP/version" status tamaño
console.log('Morgan activado - Registrando todas las peticiones');

// 3. CORS - Permitir peticiones desde otros dominios
app.use(cors({
  origin: ['http://localhost:3000', 'https://midominio.com'], // Dominios permitidos
  methods: ['GET', 'POST', 'PUT', 'DELETE'],                 // Métodos HTTP permitidos
  allowedHeaders: ['Content-Type', 'Authorization']          // Headers permitidos
}));
console.log('CORS configurado - Peticiones cross-origin habilitadas');

// 4. RATE LIMIT - Limitar peticiones por IP
const limiter = rateLimit({
  windowMs: 15 * 60 * 1000,    // 15 minutos
  max: 100,                    // Máximo 100 peticiones por IP cada 15 minutos
  message: {
      error: 'Demasiadas peticiones desde esta IP',
      retry_after: '15 minutos'
  },
  standardHeaders: true,        // Incluir headers RateLimit en la respuesta
  legacyHeaders: false         // Deshabilitar headers RateLimit-*
});
app.use(limiter);
console.log('Rate Limit configurado - Máximo 100 peticiones cada 15 min');

// 5. FAVICON - Servir favicon.ico
app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
console.log('Favicon configurado - Sirviendo desde /public/favicon.ico');

// 6. EXPRESS.JSON - Parser para JSON
app.use(express.json({
  limit: '10mb',               // Límite de tamaño del JSON
  strict: true                 // Solo acepta arrays y objetos
}));
console.log('JSON Parser activado - Límite: 10mb');

// 7. EXPRESS.URLENCODED - Parser para formularios
app.use(express.urlencoded({
  extended: true,              // Usar librería 'qs' para parsing avanzado
  limit: '10mb'               // Límite de tamaño
}));
console.log('URL-encoded Parser activado - Formularios HTML soportados');

// 8. EXPRESS.STATIC - Servir archivos estáticos
app.use('/public', express.static(path.join(__dirname, 'public')));
app.use('/uploads', express.static(path.join(__dirname, 'uploads')));
console.log('Archivos estáticos configurados - /public y /uploads');

// RUTAS DE EJEMPLO

// Ruta principal
app.get('/', (req, res) => {
  res.json({
      mensaje: 'API funcionando con todos los middleware configurados',
      timestamp: new Date().toISOString(),
      headers_seguridad: 'Protegido por Helmet',
      cors: 'Habilitado para dominios específicos',
      rate_limit: 'Máximo 100 peticiones cada 15 minutos'
  });
});

// Ruta para probar JSON parser
app.post('/api/datos', (req, res) => {
  console.log('Datos JSON recibidos:', req.body);
  res.json({
      mensaje: 'Datos JSON procesados correctamente',
      datos_recibidos: req.body,
      tipo: 'application/json'
  });
});

// Ruta para probar formulario HTML
app.post('/api/formulario', (req, res) => {
  console.log('Datos de formulario recibidos:', req.body);
  res.json({
      mensaje: 'Formulario procesado correctamente',
      datos_recibidos: req.body,
      tipo: 'application/x-www-form-urlencoded'
  });
});

// Ruta para probar rate limiting
app.get('/api/test-limit', (req, res) => {
  res.json({
      mensaje: 'Petición procesada',
      remaining_requests: res.get('RateLimit-Remaining'),
      reset_time: res.get('RateLimit-Reset')
  });
});

// Middleware de manejo de errores (siempre al final)
app.use((err, req, res, next) => {
  console.error('Error capturado:', err.message);
  res.status(500).json({
      error: 'Error interno del servidor',
      message: 'Algo salió mal'
  });
});

// Iniciar servidor
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Servidor iniciado en http://localhost:${PORT}`);
  console.log('Endpoints disponibles:');
  console.log('GET  / - Información general');
  console.log('POST /api/datos - Probar JSON parser');
  console.log('POST /api/formulario - Probar form parser'); 
  console.log('GET  /api/test-limit - Probar rate limiting');
  console.log('GET  /public/* - Archivos estáticos
');
});

Explicación del Código:


  Helmet

Helmet (Seguridad):

  • Se coloca primero porque añade headers de seguridad cruciales
  • Protege contra ataques XSS, clickjacking, y otros vectores comunes
  • Configura automáticamente headers como X-Frame-Options, X-Content-Type-Options

  Helmet

Morgan (Logging):

  • Registra cada petición HTTP con detalles completos
  • El formato ‘combined’ incluye IP, fecha, método, URL, status y tamaño
  • Esencial para debugging y monitoreo de la aplicación

  Helmet

CORS (Cross-Origin):

  • Permite que tu API sea consumida desde otros dominios
  • Configuras qué dominios, métodos y headers están permitidos
  • Sin esto, las aplicaciones web desde otros dominios no podrán acceder

  Helmet

Rate Limiting:

  • Previene ataques de fuerza bruta y spam
  • Limita peticiones por IP en ventanas de tiempo
  • Incluye headers informativos para el cliente

  Helmet

Serve-Favicon:

  • Maneja eficientemente las peticiones al favicon.ico
  • Evita logs innecesarios por peticiones automáticas del navegador
  • Mejora la experiencia del usuario

  Helmet

Parsers (JSON y URL-encoded):

  • express.json() convierte JSON del body en objeto JavaScript
  • express.urlencoded() maneja datos de formularios HTML
  • Sin estos, req.body sería undefined

  Helmet

Express.static:

  • Sirve archivos CSS, JavaScript, imágenes, etc.
  • Configurable con diferentes rutas y opciones
  • Optimizado para rendimiento con caché automático