¿Qué es el error CORS y por qué ocurre en Node.js?
El error CORS (Cross-Origin Resource Sharing) es un mecanismo de seguridad implementado por los navegadores web que restringe las solicitudes HTTP realizadas desde un origen (dominio, protocolo o puerto) hacia un servidor ubicado en un origen diferente. Cuando desarrollas una API en Node.js (usando Express, por ejemplo) y tu frontend corre en otro puerto (como localhost:3000 llamando a localhost:5000), el navegador bloquea la respuesta por defecto si el servidor no incluye las cabeceras HTTP adecuadas.
Causas principales del bloqueo CORS
- Falta del middleware
corsen la aplicación de Express. - Ausencia de cabeceras específicas como
Access-Control-Allow-Origin. - Peticiones con credenciales (cookies o tokens de autorización) no permitidas explícitamente.
Método 1: Instalar y configurar el paquete CORS en Express
La forma más rápida y recomendada de solucionar este problema en Node.js es utilizando el paquete oficial cors disponible en npm.
- Abre tu terminal en la raíz del proyecto backend.
- Instala el paquete ejecutando el siguiente comando:
npm install cors - Abre tu archivo principal de servidor (por lo general
server.jsoapp.js). - Importa e implementa el middleware antes de definir tus rutas:
const express = require('express');
const cors = require('cors');
const app = express();
// Habilitar CORS para todas las peticiones
app.use(cors());
app.get('/api/data', (req, res) => {
res.json({ message: '¡CORS solucionado con éxito!' });
});
app.listen(5000, () => console.log('Servidor corriendo en puerto 5000'));Método 2: Configurar CORS de forma restrictiva para producción
Permitir acceso a cualquier origen (usando app.use(cors())) puede representar un riesgo de seguridad en entornos de producción. Es mejor limitar el acceso únicamente a tu dominio de frontend.
- Define un objeto de configuración con la propiedad
originapuntando a tu dominio autorizado. - Pasa dicho objeto como parámetro al middleware
cors():
const express = require('express');
const cors = require('cors');
const app = express();
const whitelist = ['https://tudominiofrontend.com', 'http://localhost:3000'];
const corsOptions = {
origin: function (origin, callback) {
if (whitelist.indexOf(origin) !== -1 || !origin) {
callback(null, true);
} else {
callback(new Error('Bloqueado por la política CORS'));
}
}
};
app.use(cors(corsOptions));Con estos métodos podrás eliminar por completo los bloqueos de origen cruzado y asegurar que tu API se comunique de manera fluida y segura con cualquier cliente autorizado.