Jak opravit chybějící hlavičku CORS Access-Control-Allow-Origin v Express.js

Pokud prohlížeč hlásí CORS header 'Access-Control-Allow-Origin' missing, klíčovou nápovědou není to, že Express.js nepřijal požadavek. Prohlížeč vám říká, že odpověď neobsahovala hlavičku CORS, která by oprávnila původ stránky k přečtení této odpovědi. Oprava proto patří na server nebo proxy, kterou kontrolujete, nikoli do náhodného nastavení na straně klienta.

Ilustrativní příklad používaný v této příručce: představte si dashboard úkolů běžící na http://localhost:5173, který volá Express API na http://localhost:3000/api/tasks. Prohlížeč blokuje JavaScriptu čtení odpovědi API, protože API nevrací hlavičku Access-Control-Allow-Origin. Jedná se o hypotetický výukový příklad, nikoli o tvrzení o reálném testu, produktu nebo nasazení.

Jak bylo ověřeno 11. září 2026, oficiální dokumentace middleware CORS pro Express uvádí verzi cors 2.8.6 a popisuje ji jako middleware, který nastavuje hlavičky odpovědi CORS. Aktuální seznam balíčků Express je v generaci 5.x, tato příručka proto upřednostňuje middleware na úrovni aplikace místo spoléhání se na starší vzory wildcard rout.

Co tato chyba ve skutečnosti znamená

Webová stránka má původ (origin) tvořený schématem, hostitelem a portem. V příkladu jsou http://localhost:5173 a http://localhost:3000 různé původy, protože se liší jejich porty. Politika stejného původu (same-origin policy) prohlížeče obvykle brání JavaScriptu na jednom původu číst zdroje z jiného, pokud cílový server nevrátí vhodné hlavičky Cross-Origin Resource Sharing (CORS).

Dokumentace MDN pro tuto přesnou chybu vysvětluje, že odpovědi chybí povinná hlavička Access-Control-Allow-Origin. Pokud kontrolujete server, měli byste nastavit původ požadujícího webu jako povolený původ. Pro veřejná API bez přihlašovacích údajů může být vhodné *; pro soukromá nebo přihlašovaná API použijte místo toho konkrétní důvěryhodné původy. Viz vysvětlení chyby chybějící Access-Control-Allow-Origin na MDN.

Krok 1: Potvrďte, že problém je CORS, a identifikujte přesný původ

Ilustrace DevTools prohlížeče generovaná AI, která ukazuje chybu CORS s chybějící hlavičkou Access-Control-Allow-Origin pro požadavek z localhostu port 5173 na Express API na portu 3000
Ilustrace generovaná AI, nikoli skutečný snímek obrazovky: prohlížeč hlásí, že odpovědi Expressu chybí hlavička Access-Control-Allow-Origin.

Otevřete vývojářské nástroje prohlížeče a zkontrolujte panely Console i Network. Zaznamenejte původ frontendu přesně tak, jak ho odesílá prohlížeč. V našem ilustrativním případě je to http://localhost:5173.

Neredukujte původ pouze na hostname. Tyto jsou různé původy: http://localhost:5173, http://localhost:3000, http://127.0.0.1:5173 a https://localhost:5173. Seznam povolených původů (allowlist) v produkci musí rovněž rozlišovat https://app.example.com od jiných schémat, hostitelů, portů nebo subdomén, pokud je záměrně nepovolíte.

Pokud je odpovědí API 404, 500, přesměrování, selhání autentizace nebo chybová stránka generovaná proxy, zkontrolujte i tuto odpověď. Hlavičky CORS musí být přítomny v odpovědi, kterou prohlížeč skutečně obdrží. Oprava aplikační routy nepomůže, pokud reverzní proxy, CDN, load balancer nebo obsluha chyb vrátí jinou odpověď bez této hlavičky.

Krok 2: Nainstalujte a načtěte oficiální middleware CORS pro Express

Ilustrace editoru kódu generovaná AI, která ukazuje příkaz npm install cors a import express a cors v server.js
Ilustrace generovaná AI, nikoli skutečný snímek obrazovky: nainstalujte middleware cors spravovaný týmem Express a načtěte ho na serveru.

Pro většinu aplikací Express je nejméně chybovým řešením middleware cors spravovaný projektem Express. Oficiální stránka middleware Expressu jej uvádí mezi middleware spravovaný týmem Express.js. Nainstalujte ho ve svém API projektu:

npm install cors

Poté ho načtěte vedle Expressu:

const express = require('express');
const cors = require('cors');

const app = express();

Oficiální dokumentace je dostupná na dokumentaci middleware cors pro Express.js. Express také dokumentuje, jak middleware na úrovni aplikace běží v pořadí požadavků, na Express.js: Používání middleware.

Krok 3: Úmyslně povolte původ frontendu

Ilustrace editoru kódu generovaná AI, která ukazuje app.use s cors origin nastaveným na http localhost port 5173 před routou Express API
Ilustrace generovaná AI, nikoli skutečný snímek obrazovky: nakonfigurujte CORS před routami API, aby povolený původ obdržel hlavičku odpovědi.

Pro hypotetický dashboard nakonfigurujte přesný vývojový původ před routami, které potřebují CORS:

const express = require('express');
const cors = require('cors');

const app = express();

const corsOptions = {
  origin: 'http://localhost:5173'
};

app.use(cors(corsOptions));
app.use(express.json());

app.get('/api/tasks', (req, res) => {
  res.json({ tasks: ['Learn Express', 'Build API'] });
});

app.listen(3000);

Umístění app.use(cors(corsOptions)) před routy API je důležité, protože Express zpracovává middleware v pořadí. Middleware potřebuje příležitost přidat hlavičky odpovědi dříve, než routa nebo předchozí middleware ukončí požadavek.

Pro skutečně veřejné API, které nepoužívá přihlašovací údaje, používá app.use(cors()) výchozí permisivní chování middleware pro původ. To je pohodlné, ale nemělo by to být vaše automatická volba pro produkci. MDN doporučuje omezit Access-Control-Allow-Origin na minimální počet původů a zdrojů, které jsou potřeba. Viz bezpečnostní doporučení MDN pro CORS.

Povolte několik známých původů bez povolení všem

Běžné produkční nastavení má lokální frontend, staging frontend a produkční frontend. Použijte allowlist a validujte příchozí původ:

const allowedOrigins = new Set([
  'http://localhost:5173',
  'https://staging.example.com',
  'https://app.example.com'
]);

const corsOptions = {
  origin(origin, callback) {
    if (!origin || allowedOrigins.has(origin)) {
      callback(null, true);
      return;
    }
    callback(new Error('Origin not allowed by CORS'));
  }
};

app.use(cors(corsOptions));

Větev !origin povoluje klienty, kteří neodesílají hlavičku Origin, jako je mnoho požadavků server-to-server a nástrojů příkazového řádku. To, zda toto chování chcete, je rozhodnutí aplikační politiky; CORS samo o sobě není autentizace.

Krok 4: Ověřte jednoduchý požadavek a případný preflight

Ilustrace panelu Network prohlížeče generovaná AI, která ukazuje odpovědi OPTIONS 204 a GET 200 plus Access-Control-Allow-Origin nastavenou na localhost port 5173
Ilustrace generovaná AI, nikoli skutečný snímek obrazovky: ověřte, že prohlížeč obdrží očekávanou hlavičku CORS a že jakýkoli preflight OPTIONS proběhne úspěšně.

Načtěte znovu frontend a zkontrolujte panel Network. Podmínkou úspěchu není pouze stav 200. Zkontrolujte hlavičky odpovědi. V našem ilustrativním případě by odpověď API měla obsahovat hodnotu původu ekvivalentní:

Access-Control-Allow-Origin: http://localhost:5173

Některé cross-origin požadavky spouštějí preflight: prohlížeč před skutečným požadavkem odešle požadavek OPTIONS, aby zkontroloval, zda jsou povoleny metoda a hlavičky. Požadavky používající metody jako PUT nebo DELETE, nebo určité vlastní/požadované hlavičky, obvykle potřebují preflight. Když je cors nainstalován jako middleware na úrovni aplikace pomocí app.use(cors(...)), oficiální dokumentace Expressu uvádí, že preflight požadavky jsou zpracovávány pro všechny routy.

Hlavičky můžete zkontrolovat i mimo prohlížeč, aniž byste tvrdili, že klient příkazového řádku vynucuje CORS:

curl -i   -H "Origin: http://localhost:5173"   http://localhost:3000/api/tasks

To je užitečné pro zjištění, co server vrací, ale úspěšný požadavek curl nebo API klienta nedokazuje, že je CORS v prohlížeči správně nakonfigurován. Dokumentace CORS pro Express explicitně uvádí, že CORS je vynucováno prohlížeči; nebrowseroví klienti neuplatňují stejné omezení čtení.

Požadavky s přihlašovacími údaji: nekombinujte přihlašovací údaje s wildcard původem

Pokud musí frontend posílat cookies nebo HTTP autentizaci cross-origin, obě strany potřebují kompatibilní nastavení. Na straně Expressu nakonfigurujte konkrétní důvěryhodný původ a povolte přihlašovací údaje:

app.use(cors({
  origin: 'https://app.example.com',
  credentials: true
}));

Na straně prohlížeče požadavek fetch, který potřebuje cookies, obvykle používá credentials: 'include'. Nepřepínejte původ serveru na * pro požadavek s přihlašovacími údaji. Prohlížeče neakceptují wildcard Access-Control-Allow-Origin spolu s CORS s přihlašovacími údaji způsobem, který vývojáři často očekávají, a neomezený původ by byl také špatnou bezpečnostní hranicí.

Proč běžná „řešení“ selhávají

PokusProč to neřeší skutečný problémLepší přístup
Nastavení mode: 'no-cors' ve fetchOdpověď se stane neprůhlednou (opaque), takže JavaScript nemůže přečíst tělo odpovědi ani většinu hlaviček.Nakonfigurujte CORS na serveru, který kontrolujete.
Testování pouze v Postmanu nebo curlTito klienti nevynucují politiku CORS prohlížeče.Zkontrolujte skutečné požadavky a hlavičky odpovědi v prohlížeči.
Použití Access-Control-Allow-Origin: * všudeJe to zbytečně široké pro soukromá API a nekompatibilní s běžnými nastaveními s přihlašovacími údaji.Povolte pouze důvěryhodné původy, pokud API není plně veřejné.
Přidání několika hlaviček Access-Control-Allow-OriginProhlížeče očekávají jednu hodnotu povoleného původu, nikoli více kopií nebo seznam původů oddělených čárkami.Validujte původ požadavku a vraťte jednu odpovídající hodnotu.
Opakovaná změna kódu frontenduChybějící hlavička je v odpovědi serveru.Opravte Express nebo proxy, která generuje konečnou odpověď.

Když kód Express vypadá správně, ale chyba přetrvává

Pokud čtyři výše uvedené kroky nevyřeší chybu, sledujte celou cestu požadavku, místo abyste slepě přidávali další hlavičky.

  • Zkontrolujte pořadí middleware. Middleware CORS by měl běžet před routami nebo obsluhami, které ukončují odpověď.
  • Zkontrolujte přesměrování. Prohlížeč může po přesměrování obdržet odpověď z jiné URL nebo původu.
  • Zkontrolujte chování proxy/CDN. Nginx, gateway, serverless platforma nebo CDN mohou přidávat, odstraňovat, duplikovat nebo nahrazovat hlavičky.
  • Zkontrolujte chybové odpovědi. Normální odpověď 200 může obsahovat hlavičky CORS, zatímco odpověď 401, 404 nebo 500 ne.
  • Zkontrolujte doslovný původ. Schéma, hostname a port jsou všechny důležité; localhost a 127.0.0.1 nejsou pro shodu CORS zaměnitelné.
  • Zkontrolujte duplicitní hlavičky. MDN dokumentuje, že více hlaviček Access-Control-Allow-Origin není povoleno. Viz MDN o více hlavičkách Access-Control-Allow-Origin.

Manuální hlavičky versus middleware cors

Hlavičky CORS můžete nastavit ručně pomocí API odpovědí Expressu, ale je snadné přehlédnout chování preflight, pravidla pro přihlašovací údaje, dynamické shody původů, Vary: Origin nebo cesty chyb. Oficiální middleware cors již nabízí možnosti pro origin, metody, povolené hlavičky, vystavené hlavičky, přihlašovací údaje, chování preflight a max age. Pro většinu projektů Express udržuje použití tohoto middleware politiku explicitní a snáze přezkoumatelnou.

Pokud implementujete dynamickou logiku původů sami, nikdy automaticky neodrážejte každou příchozí hodnotu Origin jen proto, že je přítomna. Validujte ji proti důvěryhodné množině. MDN varuje, že neomezené cross-origin čtení může odhalit data, zejména když jsou zapojeny přihlašovací údaje.

Praktický produkční kontrolní seznam

  • Uveďte přesné původy frontendu, které by měly mít přístup ke čtení API.
  • V produkci používejte původy HTTPS a udržujte vývojové původy oddělené.
  • Nainstalujte middleware CORS před chráněné routy API, které ho potřebují.
  • Pro soukromé nebo přihlašované endpointy používejte konkrétní původy.
  • V prohlížeči ověřte jak normální odpovědi, tak odpovědi preflight OPTIONS.
  • Ověřte cesty selhání, jako jsou odpovědi 401, 404 a 500, pokud mohou být vráceny cross-origin.
  • Chápejte CORS jako politiku čtení prohlížeče, nikoli jako autentizaci nebo autorizaci.

V ilustrativním scénáři dashboardu úkolů je trvalá oprava přímočará: identifikujte přesný původ frontendu, nakonfigurujte Express tak, aby vracel odpovídající hlavičku CORS, nechte middleware na úrovni aplikace zpracovat preflight a ověřte hlavičky v odpovědi, kterou prohlížeč skutečně obdrží. Pokud hlavička stále chybí, dalším podezřelým je obvykle pořadí middleware nebo infrastruktura mezi prohlížečem a Express, nikoli samotné volání fetch na frontendu.

Oficiální odkazy

Zanechat komentář

Jak opravit chybu „PyTorch CUDA Out of Memory“ během trénování modelu

Jak opravit chybu „PyTorch CUDA Out of Memory“ během trénování modelu

Opravte chyby nedostatečné paměti CUDA v PyTorch pomocí praktického postupu: měřte paměť GPU, zmenšete pracovní množinu, použijte AMP a akumulaci gradientů, ukládejte aktivace (checkpointing) a laděte alokátor pouze v případě potřeby.

Jak opravit chybějící hlavičku CORS Access-Control-Allow-Origin v Express.js

Jak opravit chybějící hlavičku CORS Access-Control-Allow-Origin v Express.js

Opravte chybu CORS s chybějící hlavičkou Access-Control-Allow-Origin v Express.js diagnostikou původu, bezpečnou konfigurací cors, zpracováním preflight požadavků a ověřením hlaviček.

Jak opravit chybu „Cannot read properties of undefined (reading 'map')“ v Reactu

Jak opravit chybu „Cannot read properties of undefined (reading 'map')“ v Reactu

Opravte chybu Reactu „Cannot read properties of undefined (reading 'map')“ vysledováním nedefinované hodnoty, opravou stavu a dat z API a přidáním bezpečných ochranných mechanismů při vykreslování.

Jak opravit chybu Module Not Found: Nelze vyřešit fs ve Webpacku

Jak opravit chybu Module Not Found: Nelze vyřešit fs ve Webpacku

Opravte chybu Webpacku „Nelze vyřešit 'fs'“ správným řešením: přesuňte kód pouze pro Node na server, použijte závislost bezpečnou pro prohlížeč, nastavte fs:false pouze u volitelných funkcí nebo správně cílte na Node.

Jak opravit chybu „Supabase API Key Not Found“ v proměnných prostředí

Jak opravit chybu „Supabase API Key Not Found“ v proměnných prostředí

Opravte chybějící klíče API Supabase v Next.js, Vite, Node, nasazeních a Edge Functions. Použijte aktuální názvy publikovatelných/secret klíčů, správné soubory env a bezpečné kroky ověření.

Jak opravit chybu „Flutter Command Not Found“ (cesta) v systému macOS

Jak opravit chybu „Flutter Command Not Found“ (cesta) v systému macOS

Opravte chybu „flutter: command not found“ v systému macOS nalezením SDK Flutter, přidáním složky bin do proměnné PATH, znovu načtením Zsh a ověřením nastavení.

Jak opravit chybu „Port 8080 je již používán“ v terminálu na Windows, macOS a Linuxu

Jak opravit chybu „Port 8080 je již používán“ v terminálu na Windows, macOS a Linuxu

Opravte chybu „Port 8080 je již používán“ nalezením procesu, který port vlastní, jeho bezpečným zastavením, řešením problémů s Dockerem nebo výběrem nového portu.

Jak opravit chybu Django „ImproperlyConfigured: The SECRET_KEY Setting Must Not Be Empty“

Jak opravit chybu Django „ImproperlyConfigured: The SECRET_KEY Setting Must Not Be Empty“

Opravte chybu Django SECRET_KEY must not be empty kontrolou aktivního modulu nastavení, proměnných prostředí, generování klíče a konfigurace produkčního prostředí.

Jak opravit chybu „Connection Refused“ u PostgreSQL na localhostu portu 5432

Jak opravit chybu „Connection Refused“ u PostgreSQL na localhostu portu 5432

Opravte chybu „connection refused“ u PostgreSQL na localhost:5432 kontrolou stavu serveru, nástroje pg_isready, naslouchání na portu, souboru postgresql.conf, mapování Dockeru a ověřování.

Jak opravit chybu „Hydration failed because the initial UI does not match“

Jak opravit chybu „Hydration failed because the initial UI does not match“

Opravte nesoulad hydratace v Reactu nebo Next.js tak, aby se serverové HTML shodovalo s prvním vykreslením na klientovi, a poté ověřte výsledek ve vývojovém i produkčním prostředí.