Domov
» Základné znalosti
»
Ako opraviť chýbajúci CORS hlavičku Access-Control-Allow-Origin v Express.js
Ako opraviť chýbajúci CORS hlavičku Access-Control-Allow-Origin v Express.js
Ak prehliadač hlási CORS header 'Access-Control-Allow-Origin' missing, dôležitou stopou nie je to, že Express.js nedokázal prijať požiadavku. Prehliadač vám hovorí, že odpoveď neobsahovala CORS hlavičku, ktorá by oprávnila pôvod stránky na čítanie tejto odpovede. Oprava preto patrí na server alebo na proxy, ktoré ovládate, nie do náhodného nastavenia na strane klienta.
Ilustratívny príklad použitý v tejto príručke: predstavte si dashboard úloh bežiaci na adrese http://localhost:5173, ktorý volá Express API na adrese http://localhost:3000/api/tasks. Prehliadač blokuje JavaScriptu čítanie odpovede API, pretože API nevracia hlavičku Access-Control-Allow-Origin. Toto je hypotetický výukový príklad, nie tvrdenie o reálnom teste, produkte alebo nasadení.
Podľa overenia z 11. septembra 2026 oficiálna dokumentácia middleware CORS pre Express uvádza verziu cors 2.8.6 a opisuje ju ako middleware, ktorý nastavuje CORS hlavičky odpovede. Aktuálne zoznamy balíkov Express sú v generácii 5.x, preto táto príručka uprednostňuje middleware na úrovni aplikácie namiesto spoliehania sa na staršie vzory wildcard rout.
Čo táto chyba skutočne znamená
Webová stránka má pôvod (origin) tvorený jej schémou, hostiteľom a portom. V príklade sú http://localhost:5173 a http://localhost:3000 rôzne pôvody, pretože sa líšia ich porty. Politika rovnakého pôvodu v prehliadači zvyčajne bráni JavaScriptu na jednom pôvode čítať zdroje z iného, pokiaľ cieľový server nevráti vhodné hlavičky Cross-Origin Resource Sharing (CORS).
Dokumentácia MDN pre túto konkrétnu chybu vysvetľuje, že odpovedi chýba požadovaná hlavička Access-Control-Allow-Origin. Ak ovládate server, mali by ste nastaviť pôvod požadujúcej stránky ako povolený pôvod. Pre verejné API bez poverení môže byť vhodné *; pre súkromné alebo poverené API používajte namiesto toho konkrétne dôveryhodné pôvody. Pozri vysvetlenie chyby chýbajúcej Access-Control-Allow-Origin na MDN.
Krok 1: Potvrďte, že problémom je CORS, a identifikujte presný pôvod
Ilustrácia generovaná AI, nie skutočná snímka obrazovky: prehliadač hlási, že odpovedi Expressu chýba Access-Control-Allow-Origin.
Otvorte vývojárske nástroje prehliadača a skontrolujte panely Console aj Network. Presne zaznamenajte pôvod frontendu tak, ako ho odosiela prehliadač. V našom ilustračnom prípade je to http://localhost:5173.
Neredukujte pôvod len na hostname. Tieto sú rôzne pôvody: http://localhost:5173, http://localhost:3000, http://127.0.0.1:5173 a https://localhost:5173. Allowlist v produkcii musí likewise rozlišovať https://app.example.com od iných schém, hostiteľov, portov alebo subdomén, pokiaľ ich zámerne nepovoľujete.
Ak je odpoveďou API 404, 500, presmerovanie, zlyhanie autentizácie alebo chybová stránka generovaná proxy, skontrolujte aj túto odpoveď. CORS hlavičky musia byť prítomné v odpovedi, ktorú prehliadač skutočne prijme. Oprava aplikačnej routy nepomôže, ak reverse proxy, CDN, load balancer alebo obsluha chýb vráti inú odpoveď bez hlavičky.
Krok 2: Nainštalujte a načítajte oficiálny Express CORS middleware
Ilustrácia generovaná AI, nie skutočná snímka obrazovky: nainštalujte middleware cors udržiavaný Expressom a načítajte ho na serveri.
Pre väčšinu aplikácií Express je najmenej chybové riešenie middleware cors udržiavaný projektom Express. Oficiálna stránka middleware Expressu ho uvádza medzi middleware udržiavaný tímom Express.js. Nainštalujte ho vo vašom API projekte:
Umiestnenie app.use(cors(corsOptions)) pred routy API je dôležité, pretože Express spracováva middleware v poradí. Middleware potrebuje šancu pridať hlavičky odpovede skôr, než routa alebo skorší middleware ukončí požiadavku.
Pre skutočne verejné API, ktoré nepoužíva poverenia, app.use(cors()) používa predvolené permisívne správanie middlewareu pre pôvod. To je pohodlné, ale nemalo by byť vaším automatickým voľbou v produkcii. MDN odporúča obmedziť Access-Control-Allow-Origin na minimálne potrebné pôvody a zdroje. Pozri bezpečnostné usmernenia MDN pre CORS.
Povoľte niekoľko známych pôvodov bez toho, aby ste povolili všetkých
Bežná produkčná konfigurácia má lokálny frontend, staging frontend a produkčný frontend. Použite allowlist a validujte prichádzajúci 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));
Vetva !origin povoľuje klientov, ktorí neodosielajú hlavičku Origin, ako je to pri mnohých požiadavkách server-to-server a nástrojoch príkazového riadku. To, či chcete toto správanie, je rozhodnutím aplikačnej politiky; CORS sám o sebe nie je autentizácia.
Krok 4: Overte jednoduchú požiadavku a prípadnú predbežnú požiadavku (preflight)
Ilustrácia generovaná AI, nie skutočná snímka obrazovky: overte, či prehliadač prijíma očakávanú CORS hlavičku a či akákoľvek predbežná požiadavka OPTIONS prebehne úspešne.
Znovu načítajte frontend a skontrolujte panel Network. Podmienkou úspechu nie je len stav 200. Skontrolujte hlavičky odpovede. V našom ilustračnom prípade by odpoveď API mala obsahovať hodnotu pôvodu ekvivalentnú:
Niektoré cross-origin požiadavky spúšťajú predbežnú požiadavku (preflight): prehliadač pošle požiadavku OPTIONS pred skutočnou požiadavkou, aby skontroloval, či sú metóda a hlavičky povolené. Požiadavky používajúce metódy ako PUT alebo DELETE, alebo určité vlastné/žiadané hlavičky, zvyčajne potrebujú preflight. Keď je cors nainštalovaný ako middleware na úrovni aplikácie pomocou app.use(cors(...)), oficiálna dokumentácia Expressu uvádza, že predbežné požiadavky sú spracované pre všetky routy.
Hlavičky môžete skontrolovať aj mimo prehliadača bez toho, aby ste tvrdili, že klient príkazového riadku vynucuje CORS:
To je užitočné na zistenie, čo server vracia, ale úspešná požiadavka curl alebo API klienta nedokazuje, že je CORS v prehliadači správne nakonfigurovaný. Dokumentácia CORS pre Express explicitne uvádza, že CORS je vynucovaný prehliadačmi; nebrowseroví klienti neuplatňujú rovnaké obmedzenie čítania.
Poverené požiadavky: nekombinujte poverenia s wildcard pôvodom
Ak musí frontend posielať cookies alebo HTTP autentizáciu cross-origin, obe strany potrebujú kompatibilné nastavenia. Na strane Expressu nakonfigurujte konkrétny dôveryhodný pôvod a povoľte poverenia:
Na strane prehliadača požiadavka fetch, ktorá potrebuje cookies, zvyčajne používa credentials: 'include'. Neprepínajte pôvod servera na * pre poverenú požiadavku. Prehliadače neakceptujú wildcard Access-Control-Allow-Origin spolu s povereným CORS spôsobom, ktorý vývojári často očakávajú, a neobmedzený pôvod by bol tiež slabou bezpečnostnou hranicou.
Prečo bežné „opravy“ zlyhávajú
Pokus
Prečo to nerieši skutočný problém
Lepší prístup
Nastavte mode: 'no-cors' vo fetch
Odpoveď sa stáva nepriehľadnou (opaque), takže JavaScript nemôže čítať telo odpovede ani väčšinu hlavičiek.
Nakonfigurujte CORS na serveri, ktorý ovládate.
Testujte len v Postman alebo curl
Títo klienti nevynucujú politiku CORS prehliadača.
Skontrolujte skutočnú požiadavku a hlavičky odpovede v prehliadači.
Používajte Access-Control-Allow-Origin: * všade
Je to zbytočne široké pre súkromné API a nekompatibilné s bežnými poverenými konfiguráciami.
Povoľte iba dôveryhodné pôvody, ak API nie je úplne verejné.
Pridajte viacero hlavičiek Access-Control-Allow-Origin
Prehliadače očakávajú jednu povolenú hodnotu pôvodu, nie viacero kópií alebo zoznam pôvodov oddelených čiarkou.
Validujte pôvod požiadavky a vráťte jednu zodpovedajúcu hodnotu.
Opakovane meníte kód frontendu
Chýbajúca hlavička je v odpovedi servera.
Opravte Express alebo proxy, ktoré generujú konečnú odpoveď.
Kedy vyzerá kód Expressu správne, ale chyba pretrváva
Ak štyri vyššie uvedené kroky nevyriešia chybu, sledujte celú cestu požiadavky namiesto slepého pridávania ďalších hlavičiek.
Skontrolujte poradie middleware. CORS middleware by mal bežať pred routami alebo handlermi, ktoré ukončujú odpoveď.
Skontrolujte presmerovania. Prehliadač môže prijímať odpoveď z inej URL alebo pôvodu po presmerovaní.
Skontrolujte správanie proxy/CDN. Nginx, gateway, serverless platforma alebo CDN môžu pridávať, odstraňovať, duplikovať alebo nahrádzať hlavičky.
Skontrolujte chybové odpovede. Normálna odpoveď 200 môže obsahovať CORS hlavičky, zatiaľ čo odpoveď 401, 404 alebo 500 nie.
Skontrolujte doslovný pôvod. Schéma, hostname a port sú dôležité; localhost a 127.0.0.1 nie sú zameniteľné pre párovanie CORS.
CORS hlavičky môžete nastaviť manuálne pomocou API odpovedí Expressu, ale je ľahké prehliadnuť správanie preflight, pravidlá poverení, dynamické párovanie pôvodov, Vary: Origin alebo cesty chýb. Oficiálny middleware cors už ponúka možnosti pre origin, metódy, povolené hlavičky, vystavené hlavičky, poverenia, správanie preflight a max age. Pre väčšinu projektov Express používanie tohto middlewareu udržiava politiku explicitnú a ľahšie preskúmateľnú.
Ak implementujete dynamickú logiku pôvodov sami, nikdy automaticky neodrážajte každú prichádzajúcu hodnotu Origin len preto, že je prítomná. Validujte ju proti dôveryhodnej množine. MDN varuje, že neobmedzené cross-origin čítania môžu odhaliť dáta, najmä keď sú zapojené poverenia.
Praktický produkčný kontrolný zoznam
Zoznam presných pôvodov frontendu, ktoré by mali byť schopné čítať API.
V produkcii používajte HTTPS pôvody a udržujte vývojové pôvody oddelené.
Nainštalujte CORS middleware pred chránené routy API, ktoré ho potrebujú.
Pre súkromné alebo poverené endpointy používajte konkrétne pôvody.
V prehliadači overte normálne odpovede aj odpovede predbežných požiadaviek OPTIONS.
Overte cesty zlyhania, ako sú odpovede 401, 404 a 500, ak môžu byť vrátené cross-origin.
Považujte CORS za politiku čítania prehliadača, nie za autentizáciu alebo autorizáciu.
V ilustračnom scenári dashboardu úloh je trvalá oprava priamočiara: identifikujte presný pôvod frontendu, nakonfigurujte Express tak, aby vracal zodpovedajúcu CORS hlavičku, nechajte middleware na úrovni aplikácie spracovať preflight a overte hlavičky v odpovedi, ktorú prehliadač skutočne prijíma. Ak hlavička stále chýba aj potom, ďalším podozrivým je zvyčajne poradie middleware alebo infraštruktúra medzi prehliadačom a Expressom, nie samotné volanie fetch na frontendu.