Introducción al Error CORS en Node.js
Uno de los dolores de cabeza más frecuentes para los desarrolladores web full-stack es el temido error de CORS (Cross-Origin Resource Sharing) al intentar conectar una aplicación frontend (como React, Angular o Vue) con un servidor backend desarrollado en Node.js utilizando Express. Este mecanismo de seguridad de los navegadores bloquea las peticiones HTTP realizadas desde un dominio, puerto o protocolo diferente al del servidor de recursos, a menos que el backend indique explícitamente lo contrario.
Causas Principales del Problema
El error se origina debido a las políticas de seguridad de un mismo origen (Same-Origin Policy) implementadas por los navegadores modernos. Las causas más comunes incluyen:
- Intentar realizar peticiones AJAX o Fetch desde
http://localhost:3000hacia una API enhttp://localhost:5000. - Falta de las cabeceras HTTP obligatorias de control de acceso (Access-Control-Allow-Origin) en las respuestas del servidor.
- Configuración incorrecta o inexistente del middleware CORS en la aplicación Express.
Método 1: Instalar y Configurar el Paquete CORS en Express (Recomendado)
La forma más limpia, rápida y segura de solucionar este problema en Node.js es utilizando el middleware oficial cors.
- Abre tu terminal en la raíz del proyecto backend.
- Instala el paquete ejecutando el siguiente comando:
npm install cors - Abre el archivo principal de tu servidor (por ejemplo,
app.jsoserver.js). - Importa y habilita el middleware antes de definir tus rutas:
const express = require('express');const cors = require('cors');const app = express();app.use(cors()); - Reinicia tu servidor Node.js y prueba realizar la petición desde tu frontend.
Método 2: Configurar CORS para Dominios Específicos y Opciones Avanzadas
Si tu aplicación va a pasar a producción, dejar el acceso abierto a cualquier origen (*) puede representar un riesgo de seguridad. Es recomendable limitar el acceso únicamente a los dominios autorizados.
- Define un objeto de configuración con las opciones permitidas:
const whitelist = ['https://tudominio.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'));}}}; - Aplica las opciones directamente en el middleware:
app.use(cors(corsOptions));
Método 3: Configuración Manual de Cabeceras HTTP (Sin Dependencias)
Si por alguna razón no puedes instalar paquetes externos en tu entorno de desarrollo, puedes configurar las cabeceras de respuesta de manera manual utilizando un middleware personalizado en Express.
- Crea un middleware global al inicio de tus rutas:
app.use((req, res, next) => {res.header('Access-Control-Allow-Origin', 'http://localhost:3000');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();}); - Asegúrate de manejar también las peticiones pre-flight (método OPTIONS) si tu API recibe cabeceras personalizadas o tokens Bearer, respondiendo con un estatus 200 de manera anticipada.