<?php
$pageTitle = 'Cómo Solucionar el Error CORS (Cross-Origin Resource Sharing) en JavaScript y Node.js de Forma Definitiva';
$pageDesc  = 'Aprende a solucionar el molesto error CORS en tus aplicaciones web con JavaScript y Node.js paso a paso. ¡Optimiza tu API hoy!';
$imageUrl  = 'https://images.unsplash.com/photo-1555066931-4365d14bab8c?auto=format&fit=crop&w=800&q=80';
$basePath  = "../";

include __DIR__ . "/../includes/header.php";
?>

<div class="container layout">
    <main class="article-container">
        <h1 class="article-title"><?php echo htmlspecialchars($pageTitle); ?></h1>
        <div class="article-meta">Categoría: <strong>Desarrollo</strong> | Publicado el 30/09/2026</div>

        <div class="article-featured-image" style="margin: 20px 0; border-radius: 8px; overflow: hidden;">
            <img src="<?php echo htmlspecialchars($imageUrl); ?>" alt="<?php echo htmlspecialchars($pageTitle); ?>" style="width: 100%; height: auto; max-height: 400px; display: block; object-fit: cover;">
        </div>

        <div class="ad-container">
            <div class="ad-label">Anuncio relacionado</div>
            <ins class="adsbygoogle" style="display:block; text-align:center;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9528155186955160" data-ad-slot="3333333333"></ins>
            <script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
        </div>

        <div class="article-content">
            <h2>¿Qué es el error CORS y por qué aparece en tus aplicaciones web?</h2><p>El error CORS (Cross-Origin Resource Sharing o Intercambio de Recursos de Origen Cruzado) es un mecanismo de seguridad implementado por los navegadores web modernos. Su función principal es restringir las solicitudes HTTP realizadas desde scripts hacia un dominio diferente al que sirvió la página original, previniendo así ataques de falsificación de peticiones en sitios cruzados (CSRF).</p><p>Sin embargo, durante el desarrollo de aplicaciones web modernas, es extremadamente común separar el frontend (por ejemplo, React o Vue ejecutándose en <code>http://localhost:3000</code>) del backend (una API REST en Node.js en <code>http://localhost:5000</code>). Cuando el navegador detecta esta diferencia de puertos o dominios sin los permisos adecuados, bloquea la respuesta y muestra el temido error en la consola.</p><h2>Causas principales del bloqueo por CORS</h2><p>Identificar la causa raíz te ahorrará horas de frustración al depurar tu código. Las razones más habituales por las que surge este inconveniente son:</p><ul><li>Falta de cabeceras HTTP de control de acceso en las respuestas del servidor.</li><li>Intento de enviar credenciales (como cookies o tokens de autorización) sin la configuración explícita en el cliente y el servidor.</li><li>Bloqueo de solicitudes de tipo preflight (peticiones OPTIONS) que el navegador envía antes de métodos complejos como PUT, DELETE o con cabeceras personalizadas.</li></ul><h2>Método 1: Solucionar CORS en Node.js usando el paquete Express CORS</h2><p>Si tu API está construida con Node.js y Express, la forma más rápida, limpia y recomendada de solucionar este problema es utilizando el middleware oficial <code>cors</code>.</p><ol><li>Abre tu terminal en la carpeta raíz del servidor backend e instala el paquete ejecutando: <code>npm install cors</code></li><li>Abre tu archivo principal de configuración (generalmente <code>app.js</code> o <code>server.js</code>).</li><li>Importa el módulo e intégralo en tu aplicación antes de definir las rutas:</li></ol><p><code>const express = require('express');</code></p><p><code>const cors = require('cors');</code></p><p><code>const app = express();</code></p><p><code>app.use(cors());</code></p><p><code>// Ejemplo de ruta</code></p><p><code>app.get('/api/data', (req, res) => { res.json({ message: '¡CORS solucionado!' }); });</code></p><p><code>app.listen(5000, () => console.log('Servidor corriendo en puerto 5000'));</code></p><h2>Método 2: Configurar políticas CORS avanzadas para entornos de producción</h2><p>Utilizar <code>app.use(cors())</code> permite el acceso desde cualquier origen, lo cual es útil en desarrollo, pero inseguro para producción. Para restringir el acceso únicamente a tu dominio de confianza, debes pasar un objeto de configuración.</p><ol><li>Define la lista blanca de orígenes permitidos en tu archivo de servidor:</li></ol><p><code>const whitelist = ['https://tudominio.com', 'http://localhost:3000'];</code></p><p><code>const corsOptions = {</code></p><p><code>  origin: function (origin, callback) {</code></p><p><code>    if (whitelist.indexOf(origin) !== -1 || !origin) {</code></p><p><code>      callback(null, true);</code></p><p><code>    } else {</code></p><p><code>      callback(new Error('Bloqueado por la política CORS'));</code></p><p><code>    }</code></p><p><code>  }</code></p><p><code>};</code></p><p><code>app.use(cors(corsOptions));</code></p><h2>Método 3: Configuración manual de cabeceras HTTP sin librerías externas</h2><p>Si por alguna razón no puedes utilizar paquetes externos en tu entorno Node.js puro, puedes configurar manualmente las cabeceras requeridas por el navegador mediante un middleware personalizado.</p><ol><li>Crea una función middleware que interceptes todas las peticiones entrantes:</li></ol><p><code>app.use((req, res, next) => {</code></p><p><code>  res.setHeader('Access-Control-Allow-Origin', 'http://localhost:3000');</code></p><p><code>  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');</code></p><p><code>  res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');</code></p><p><code>  next();</code></p><p><code>});</code></p><p>Siguiendo cualquiera de estos métodos, podrás eliminar definitivamente el error CORS de tu consola y garantizar una comunicación fluida y segura entre tu interfaz de usuario y tu API.</p>
        </div>

        <div class="ad-container">
            <div class="ad-label">Anuncio</div>
            <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-9528155186955160" data-ad-slot="4444444444" data-ad-format="auto" data-full-width-responsive="true"></ins>
            <script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
        </div>
    </main>

    <?php include __DIR__ . "/../includes/sidebar.php"; ?>
</div>

<?php include __DIR__ . "/../includes/footer.php"; ?>