¿Qué es el error CORS y por qué ocurre?
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 otro diferente. Cuando desarrollas aplicaciones web modernas separando el frontend (por ejemplo, React o Vue) del backend (Node.js con Express), es muy común encontrarse con este bloqueo en la consola del navegador.
Causas principales del bloqueo CORS
- El servidor backend no incluye las cabeceras HTTP necesarias para permitir solicitudes desde el origen del frontend.
- Intentar realizar peticiones con credenciales (como cookies o tokens de autenticación) sin la configuración adecuada en el cliente y el servidor.
- Métodos HTTP no permitidos (como PUT o DELETE) bloqueados por la política de seguridad predeterminada del navegador.
Método 1: Configurar CORS en Node.js usando el paquete cors
La forma más sencilla y recomendada de solucionar este problema en un servidor Node.js con Express es utilizando el middleware oficial cors.
- Instala el paquete en tu proyecto ejecutando el comando
npm install corsen tu terminal. - Importa y utiliza el middleware en tu archivo principal (ej.
server.jsoapp.js) antes de definir tus rutas. - Añade el siguiente código en tu aplicación:
const express = require('express'); const cors = require('cors'); const app = express(); app.use(cors()); app.get('/api/data', (req, res) => { res.json({ message: '¡CORS solucionado con éxito!' }); }); app.listen(3000);
Método 2: Configurar cabeceras HTTP manualmente en el servidor
Si no deseas utilizar librerías externas en Node.js o estás utilizando otro lenguaje para tu API, puedes configurar las cabeceras de respuesta de manera manual añadiendo un middleware personalizado.
- Crea un middleware global en tu servidor que intercepte todas las peticiones entrantes.
- Añade las cabeceras
Access-Control-Allow-Originpermitiendo tu dominio específico o utilizando un asterisco*para desarrollo local. - Implementa el código correspondiente:
app.use((req, res, next) => { res.header('Access-Control-Allow-Origin', 'http://localhost:3001'); res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization'); res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); next(); });