Express.js tiene una gran variedad de middleware disponibles. Aquí tienes los más importantes y utilizados:
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
');
}); Helmet (Seguridad):
X-Frame-Options, X-Content-Type-OptionsMorgan (Logging):
CORS (Cross-Origin):
Rate Limiting:
Serve-Favicon:
Parsers (JSON y URL-encoded):
express.json() convierte JSON del body en objeto JavaScriptexpress.urlencoded() maneja datos de formularios HTMLreq.body sería undefinedExpress.static: