Kaip išspręsti CORS antraštės Access-Control-Allow-Origin trūkumo klaidą Express.js

Jei naršyklė rodo klaidą CORS header 'Access-Control-Allow-Origin' missing, svarbus požymis yra ne tai, kad Express.js nepavyko gauti užklausos. Naršyklė nurodo, kad atsakyme nebuvo CORS antraštės, leidžiančios puslapio kilmę skaityti tą atsakymą. Todėl sprendimas turi būti taikomas serveryje arba proxy, kurį valdote, o ne atsitiktiniame kliento pusės nustatyme.

Iliustracinis pavyzdys, naudojamas visame šiame vadove: įsivaizduokite užduočių skydelį, veikiančią adresatu http://localhost:5173, kuris kreipiasi į Express API adresu http://localhost:3000/api/tasks. Naršyklė blokuoja JavaScript galimybę skaityti API atsakymą, nes API negrąžina Access-Control-Allow-Origin. Tai hipotetinis mokomasis pavyzdys, o ne teiginys apie realų testą, produktą ar diegimą.

Patikrinta 2026 m. rugsėjo 11 d., oficialioje Express CORS tarpinės programinės įrangos dokumentacijoje nurodyta cors versija 2.8.6 ir ji apibūdinama kaip tarpinė programinė įranga, nustatanti CORS atsakymo antraštes. Dabartinis Express paketo sąrašas yra 5.x kartos, todėl šiame vadove pirmenybė teikiama programos lygio tarpinei programinei įrangai, o ne senesniems laukinių maršrutų šablonams.

Ką iš tikrųjų reiškia ši klaida

Tinklalapis turi kilmę, sudarytą iš jo schemos, pagrindinio kompiuterio ir prievado. Pavyzdyje http://localhost:5173 ir http://localhost:3000 yra skirtingos kilmės, nes jų prievadai skiriasi. Naršyklių vienodos kilmės politika paprastai neleidžia vienos kilmės JavaScript skaityti išteklių iš kitos kilmės, nebent tikslinis serveris grąžina tinkamas tarpšaltinės išteklių dalijimosi (CORS) antraštes.

MDN dokumentacija šiai konkrečiai klaidai paaiškina, kad atsakyme trūksta būtinos Access-Control-Allow-Origin antraštės. Jei kontroliuojate serverį, turėtumėte sukonfigūruoti užklausą siunčiančios svetainės kilmę kaip leidžiamą kilmę. Viešoms, be kredencialų naudojamoms API, * gali būti tinkamas; privačioms arba su kredencialais naudojamoms API, vietoj to naudokite konkrečias patikimas kilmes. Žiūrėkite MDN paaiškinimą apie trūkstamą Access-Control-Allow-Origin klaidą.

1 žingsnis: Patvirtinkite, kad problema yra CORS, ir nustatykite tikslią kilmę

Dirbtiniu intelektu sugeneruota naršyklės DevTools iliustracija, rodanti trūkstamą Access-Control-Allow-Origin CORS klaidą užklausai iš localhost prievado 5173 į Express API prievade 3000
Dirbtiniu intelektu sugeneruota iliustracija, o ne tikra ekrano kopija: naršyklė praneša, kad Express atsakyme trūksta Access-Control-Allow-Origin.

Atidarykite naršyklės kūrėjo įrankius ir patikrinkite tiek Konsolės, tiek Tinklo skydelius. Užfiksuokite frontend kilmę tiksliai taip, kaip ją siunčia naršyklė. Mūsų iliustraciniu atveju tai yra http://localhost:5173.

Nesuprastinkite kilmės tik iki pagrindinio kompiuterio pavadinimo. Šios yra skirtingos kilmės: http://localhost:5173, http://localhost:3000, http://127.0.0.1:5173 ir https://localhost:5173. Gamintojo leidžiamųjų sąrašas taip pat turi atskirti https://app.example.com nuo kitų schemų, pagrindinių kompiuterių, prievadų ar poantraščių, nebent sąmoningai leidžiate jas.

Jei API atsakymas yra 404, 500, peradresavimas, autentifikavimo nesėkmė arba proxy sugeneruotas klaidų puslapis, patikrinkite ir tą atsakymą. CORS antraštės turi būti pateiktos atsakyme, kurį naršyklė iš tikrųjų gauna. Programos maršruto taisymas nepadės, jei atvirkštinis proxy, CDN, apkrovos balansuotojas ar klaidų apdorojimo programa grąžina kitą atsakymą be antraštės.

2 žingsnis: Įdiekite ir įkelkite oficialią Express CORS tarpinę programinę įrangą

Dirbtiniu intelektu sugeneruota kodo redaktoriaus iliustracija, rodanti npm install cors komandą ir express bei cors importavimą serveryje.js
Dirbtiniu intelektu sugeneruota iliustracija, o ne tikra ekrano kopija: įdiekite Express komandos prižiūrimą cors tarpinę programinę įrangą ir įkelkite ją į serverį.

Daugumai Express programų mažiausiai klaidų sukeliantis sprendimas yra cors tarpinė programinė įranga, kurią prižiūri Express projektas. Oficiali Express tarpinės programinės įrangos puslapyje ji išvardyta tarp tarpinių programų, kurias prižiūri Express.js komanda. Įdiekite ją savo API projekte:

npm install cors

Tada įkelkite ją šalia Express:

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

const app = express();

Oficiali dokumentacija prieinama adresu Express.js cors tarpinės programinės įrangos dokumentacija. Express taip pat dokumentuoja, kaip programos lygio tarpinė programinė įranga veikia užklausų tvarka, adresu Express.js: Tarpinės programinės įrangos naudojimas.

3 žingsnis: Sąmoningai leiskite frontend kilmę

Dirbtiniu intelektu sugeneruota kodo redaktoriaus iliustracija, rodanti app.use su cors origin nustatytu į http localhost prievadą 5173 prieš Express API maršrutą
Dirbtiniu intelektu sugeneruota iliustracija, o ne tikra ekrano kopija: sukonfigūruokite CORS prieš API maršrutus, kad leidžiama kilmė gautų atsakymo antraštę.

Hipotetiniam skydeliui sukonfigūruokite tikslią plėtros kilmę prieš maršrutus, kuriems reikia 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);

Svarbu, kad app.use(cors(corsOptions)) būtų prieš API maršrutus, nes Express apdoroja tarpinę programinę įrangą pagal eiliškumą. Tarpinei programinei įrangai reikia galimybės pridėti atsakymo antraštes prieš tai, kai maršrutas arba ankstesnė tarpinė programinė įranga baigia užklausą.

Tikrai viešai API, kuri nenaudoja kredencialų, app.use(cors()) naudoja numatytąjį tarpinės programinės įrangos leidžiantį kilmės elgesį. Tai patogu, tačiau tai neturėtų būti automatinis gamintojo pasirinkimas. MDN rekomenduoja apriboti Access-Control-Allow-Origin iki minimalių reikalingų kilmų ir išteklių. Žiūrėkite MDN CORS saugumo gaires.

Leiskite kelias žinomas kilmes, neleisdami visiems

Dažna gamintojo konfigūracija turi vietinį frontend, bandymų aplinkos frontend ir gamintojo frontend. Naudokite leidžiamųjų sąrašą ir patikrinkite gaunamą kilmę:

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));

!origin šaka leidžia klientams, kurie nesiunčia Origin antraštės, pvz., daugeliui serverio ir serverio užklausų bei komandinės eilutės įrankiams. Ar norite tokio elgesio, yra programos politikos sprendimas; pats CORS nėra autentifikavimas.

4 žingsnis: Patikrinkite paprastą užklausą ir bet kokį išankstinį tikrinimą

Dirbtiniu intelektu sugeneruota naršyklės Tinklo skydelio iliustracija, rodanti OPTIONS 204 ir GET 200 atsakymus bei Access-Control-Allow-Origin nustatytą į localhost prievadą 5173
Dirbtiniu intelektu sugeneruota iliustracija, o ne tikra ekrano kopija: patikrinkite, ar naršyklė gauna tikėtiną CORS antraštę, ir ar bet koks OPTIONS išankstinis tikrinimas pavyksta.

Perkraukite frontend ir patikrinkite Tinklo skydelį. Sėkmės sąlyga nėra vien tik 200 būsena. Patikrinkite atsakymo antraštes. Mūsų iliustraciniu atveju API atsakyme turėtų būti kilmės reikšmė, atitinkanti:

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

Kai kurios tarpšaltinės užklausos sukelia išankstinį tikrinimą: naršyklė siunčia OPTIONS užklausą prieš tikrąją užklausą, kad patikrintų, ar metodas ir antraštės yra leidžiami. Užklausos, naudojantys metodus, tokius kaip PUT ar DELETE, arba tam tikras tinkintas/užklausos antraštes, dažniausiai reikalauja išankstinio tikrinimo. Kai cors yra įdiegta kaip programos lygio tarpinė programinė įranga naudojant app.use(cors(...)), oficiali Express dokumentacija teigia, kad išankstinės tikrinimo užklausos yra apdorojamos visiems maršrutams.

Taip pat galite patikrinti antraštes ne naršyklėje, neteigdami, kad komandinės eilutės klientas taiko CORS:

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

Tai naudinga norint pamatyti, ką grąžina serveris, tačiau sėkminga curl arba API kliento užklausa neproto, kad naršyklės CORS yra sukonfigūruotas teisingai. Express CORS dokumentacija aiškiai nurodo, kad CORS taiko naršyklės; ne naršyklių klientai netaiko to paties skaitymo apribojimo.

Užklausos su kredencialais: nejungkite kredencialų su laukinio ženklo kilme

Jei frontend turi siųsti slapukus arba HTTP autentifikavimą tarp šaltinių, abi pusės turi turėti suderinamus nustatymus. Express pusėje sukonfigūruokite konkrečią patikimą kilmę ir įgalinkite kredencialus:

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

Naršyklės pusėje fetch užklausa, kuriai reikia slapukų, paprastai naudoja credentials: 'include'. Nekeiskite serverio kilmės į * užklausai su kredencialais. Naršyklės nepriima laukinio ženklo Access-Control-Allow-Origin kartu su CORS su kredencialais taip, kaip dažnai tikisi kūrėjai, o neapribota kilmė taip pat būtų prasta saugumo riba.

Kodėl dažni „sprendimai“ nepavyksta

Bandomas veiksmasKodėl tai neišsprendžia tikrosios problemosGeresnis būdas
Nustatyti mode: 'no-cors' fetchAtsakymas tampa nepermatomas, todėl JavaScript negali skaityti atsakymo kūno ar daugumos antraščių.Sukonfigūruokite CORS serveryje, kurį valdote.
Tikrinti tik Postman arba curlTie klientai netaiko naršyklės CORS politikos.Tikrinkite faktines naršyklės užklausos ir atsakymo antraštes.
Naudoti Access-Control-Allow-Origin: * visurTai nereikalingai plaču privačioms API ir nesuderinama su dažnomis konfigūracijomis su kredencialais.Leiskite tik patikimas kilmes, kai API nėra visiškai vieša.
Pridėti kelias Access-Control-Allow-Origin antraštesNaršyklės tikisi vienos leidžiamos kilmės reikšmės, o ne kelių kopijų arba kableliais atskirto kilmės sąrašo.Patikrinkite užklausos kilmę ir grąžinkite vieną atitinkančią reikšmę.
Kartoti keisti frontend kodąTrūkstama antraštė yra serverio atsakyme.Taisykite Express arba proxy, kuris generuoja galutinį atsakymą.

Kai Express kodas atrodo teisingas, bet klaida lieka

Jei keturi aukščiau nurodyti žingsniai neišsprendžia klaidos, sekite visą užklausos kelią, o ne aklai pridėkite daugiau antraščių.

  • Patikrinkite tarpinės programinės įrangos eiliškumą. CORS tarpinė programinė įranga turėtų veikti prieš maršrutus arba apdorojimo programas, kurios baigia atsakymą.
  • Patikrinkite peradresavimus. Naršyklė gali gauti atsakymą iš kito URL arba kilmės po peradresavimo.
  • Patikrinkite proxy/CDN elgesį. Nginx, vartai, serverless platforma arba CDN gali pridėti, pašalinti, dubliuoti arba pakeisti antraštes.
  • Patikrinkite klaidų atsakymus. Įprastas 200 atsakymas gali turėti CORS antraštes, o 401, 404 arba 500 atsakymas – ne.
  • Patikrinkite literalinę kilmę. Schema, pagrindinio kompiuterio pavadinimas ir prievadas yra svarbūs; localhost ir 127.0.0.1 nėra pakaitiniai CORS atitikimui.
  • Patikrinkite dubliuotas antraštes. MDN dokumentuoja, kad kelios Access-Control-Allow-Origin antraštės nėra leidžiamos. Žiūrėkite MDN apie kelias Access-Control-Allow-Origin antraštes.

Rankinės antraštės prieš cors tarpinę programinę įrangą

Galite nustatyti CORS antraštes rankiniu būdu naudodami Express atsakymo API, tačiau lengva praleisti išankstinio tikrinimo elgesį, kredencialų taisykles, dinaminį kilmės atitikimą, Vary: Origin arba klaidų kelius. Oficiali cors tarpinė programinė įranga jau pateikia parinktis origin, metodams, leidžiamoms antraštėms, atskleidžiamoms antraštėms, kredencialams, išankstinio tikrinimo elgesiui ir maksimaliam amžiui. Daugumai Express projektų šios tarpinės programinės įrangos naudojimas išlaiko politiką aiškią ir lengviau peržiūrimą.

Jei patys įgyvendinate dinaminę kilmės logiką, niekada automatiškai neatkartokite kiekvienos gaunamos Origin reikšmės vien todėl, kad ji yra pateikta. Patikrinkite ją pagal patikimų kilmų rinkinį. MDN įspėja, kad neapriboti tarpšaltiniai skaitymai gali atskleisti duomenis, ypač kai naudojami kredencialai.

Praktinis gamintojo patikros sąrašas

  • Išvardykite tikslias frontend kilmes, kurios turėtų galėti skaityti API.
  • Gamintoje aplinkoje naudokite HTTPS kilmes ir laikykite plėtros kilmes atskirai.
  • Įdiekite CORS tarpinę programinę įrangą prieš apsaugotus API maršrutus, kuriems jos reikia.
  • Privačioms arba su kredencialais naudojamoms galinėms taškams naudokite konkrečias kilmes.
  • Naršyklėje patikrinkite tiek įprastus atsakymus, tiek išankstinio tikrinimo OPTIONS atsakymus.
  • Jei jie gali būti grąžinti tarp šaltinių, patikrinkite nesėkmės kelius, tokius kaip 401, 404 ir 500 atsakymai.
  • Laikykite CORS naršyklės skaitymo politika, o ne autentifikavimu arba autorizacija.

Iliustraciniame užduočių skydelio scenarijuje patvarus sprendimas yra paprastas: nustatykite tikslią frontend kilmę, sukonfigūruokite Express grąžinti atitinkančią CORS antraštę, leiskite programos lygio tarpinei programinei įrangai apdoroti išankstinį tikrinimą ir patikrinkite antraštes atsakyme, kurį naršyklė iš tikrųjų gauna. Jei antraštė vis tiek trūksta po to, kitas įtariamasis paprastai yra tarpinės programinės įrangos eiliškumas arba infrastruktūra tarp naršyklės ir Express, o ne pati frontend fetch užklausa.

Oficialios nuorodos

Palikti komentarą

Kaip ištaisyti klaidą „Prisma Client has not been generated yet“

Kaip ištaisyti klaidą „Prisma Client has not been generated yet“

Ištaisykite „Prisma Client“ nesugeneravimo klaidą patikrinę generatorių, schemą, išvesties kelią, importus, versijas, monorepo sąranką ir diegimo kūrimo veiksmus.

Kaip išspręsti SSL sertifikato problemą: „Unable to Get Local Issuer Certificate“ Git

Kaip išspręsti SSL sertifikato problemą: „Unable to Get Local Issuer Certificate“ Git

Ištaisykite Git klaidą „unable to get local issuer certificate“ nustatydami pasitikėjimo šaltinį, įdiegdami tinkamą CA grandinę ir palikdami įjungtą SSL patikrą.

Kaip išspręsti MongoDB tinklo laiko limito klaidą Mongoose jungtyje

Kaip išspręsti MongoDB tinklo laiko limito klaidą Mongoose jungtyje

Ištaisykite MongoDB tinklo laiko limito klaidas Mongoose nustatydami laiko limito tipą, patikrindami Atlas arba TCP pasiekiamumą, koreguodami URI ir tikslindami laiko limitus tik tada, kai tai pagrįsta.

Kaip išspręsti „Execution Policy Restricted“ klaidą Windows PowerShell

Kaip išspręsti „Execution Policy Restricted“ klaidą Windows PowerShell

Ištaisykite PowerShell vykdymo politikos „Restricted“ klaidą patikrindami sritį ir grupės politiką, tada pasirinkdami RemoteSigned, Unblock-File arba laikiną sesijos parinktį.

Kaip išspręsti npm ERR! code ERESOLVE peer dependency konfliktą

Kaip išspręsti npm ERR! code ERESOLVE peer dependency konfliktą

Ištaisykite npm ERESOLVE peer dependency konfliktus nustatydami nesuderinamą paketo diapazoną, suderindami versijas, naudodami komandas npm explain ir npm ls, bei laikydami legacy-peer-deps arba force tik kontroliuojamais atsarginiais variantais.

Kaip ištaisyti Redis prisijungimo prie 127.0.0.1:6379 klaidą

Kaip ištaisyti Redis prisijungimo prie 127.0.0.1:6379 klaidą

Ištaisykite Redis prisijungimo atmetimo klaidas adresu 127.0.0.1:6379 tikrindami serverį, prievadą, Docker tinklą, redis.conf, autentifikaciją ir TLS.

Kaip ištaisyti vidinę 500 klaidą Next.js Server Components

Kaip ištaisyti vidinę 500 klaidą Next.js Server Components

Ištaisykite Next.js Server Component 500 klaidas stebėdami serverio žurnalus, tikrindami duomenų gavimą ir aplinkos kintamuosius, apdorodami klaidas ir patikrindami gamybinį sukūrimą.

Kaip išspręsti Kubernetes CrashLoopBackOff klaidą vietiniame Minikube

Kaip išspręsti Kubernetes CrashLoopBackOff klaidą vietiniame Minikube

Diagnozuokite ir ištaisykite Kubernetes CrashLoopBackOff klaidą vietiniame Minikube tikrindami pod būseną, ankstesnius žurnalus, išėjimo priežastis, zondas, konfigūraciją, atminties apribojimus ir klasterio sveikatą.

Kaip išspręsti „Docker Desktop Engine Stopped“ klaidą sistemoje Windows 11

Kaip išspręsti „Docker Desktop Engine Stopped“ klaidą sistemoje Windows 11

Ištaisykite „Docker Desktop Engine Stopped“ klaidą sistemoje Windows 11 tikrindami Docker būseną, atnaujindami ir paleisdami iš naujo WSL 2, tikrindami virtualizaciją bei naudodami diagnostiką prieš atstatymą.

Kaip ištaisyti klaidą „Uncaught ReferenceError: process is not defined“ naudojant Vite

Kaip ištaisyti klaidą „Uncaught ReferenceError: process is not defined“ naudojant Vite

Ištaisykite Vite klaidą „process is not defined“ pakeisdami Node stiliaus process.env naudojimą, teisingai sukonfigūruodami VITE_ kintamuosius ir patikrindami priklausomybes.