← Hjem

Slik fikser du CORS-feil i AI-genererte apper

CORS er en nettlesermekanisme, ikke en serverfeil. Derfor fungerer Postman, men den utrullede appen din gjør det ikke. Denne guiden viser deg steg for steg hvordan du fikser det riktig.

⏱ 15 min lesing

CORS er en nettlesermekanisme. Hver gang appen din prøver å sende en forespørsel til en annen host, spør nettleseren serveren om det er tillatt. Det er ikke en feil i koden din — det er et sikkerhetslag innebygd i hver nettleser. Problemet er at de fleste aldri lærte hvordan det fungerer.

AI-generert kode pluss offentlig utrulling er der de fleste brenner seg. På localhost fungerte alt fordi frontend og backend levde på samme adresse. Etter utrulling — de er på ulike domener og nettleseren blokkerer forespørslene.

Denne artikkelen er en praktisk steg-for-steg-guide. Vi forklarer hva CORS egentlig er, hvorfor AI-verktøy gjør det verre, og hvordan du fikser det en gang for alle — med kode du kan kopiere og bruke med en gang.

01

Hva CORS egentlig er

CORS (Cross-Origin Resource Sharing) er en sikkerhetsmekanisme i nettleseren, ikke en serverfeil. Slik fungerer det: hver gang applikasjonen din prøver å sende en HTTP-forespørsel til en annen origin (et annet domene, port eller protokoll), spør nettleseren først målserveren om det er tillatt.

På localhost kjører frontend og backend vanligvis på samme adresse — for eksempel http://localhost:3000. Det er same-origin — samme domene, samme port, samme protokoll. Nettleseren ser ikke noe problem fordi forespørselen går til samme host. Det er derfor alt fungerer under utvikling.

Etter utrulling lever frontend på https://minapp.com og backend på https://api.minapp.com eller et helt annet domene. Det er cross-origin. Og der trer nettleseren inn.

Før nettleseren sender din faktiske forespørsel (POST, PUT, DELETE), sender den først en såkalt preflight-forespørsel — en OPTIONS-forespørsel til samme URL. Den spør i bunn og grunn: «Hei server, har frontend fra domene X lov til å sende POST-forespørsler med disse headerne?» Hvis serveren ikke svarer med riktige CORS-headere, blokkerer nettleseren forespørselen før den i det hele tatt sendes.

Det viktigste å forstå: CORS er en nettlesermekanisme. Postman, curl, server-til-server-forespørsler — ingen av dem håndhever CORS. Derfor kan API-et ditt fungere perfekt i Postman mens det kaster feil i nettleseren. Det er ikke en API-feil — det er nettleseren som gjør jobben sin.

CORS

CORS er en nettlesermekanisme. Hver gang du prøver å sende en forespørsel til en annen host, spør nettleseren om det er tillatt. Derfor fungerer Postman mens nettleseren din ikke gjør det — Postman er ikke en nettleser og håndhever ikke denne regelen.

02

CORS-kaskaden: slik gjør AI det verre

Her er det typiske scenariet: du ser en CORS-feil i konsollen. Du sier til AI «fiks CORS». AI endrer noe i serverkoden. CORS-feilen forsvinner — men nå er noe annet ødelagt. Du sier til AI «fiks det». AI skriver om en annen del av koden. Og slik begynner kaskaden.

Jeg har sett dette på førstehånd hos kunder: å la AI «fikse CORS» skrev om serverkoden, ødela importer, databasespørringer og svarsformater. Tre dager på å angre det AI gjorde på sekunder.

Problemet er fundamentalt: AI forstår ikke grensen mellom frontend og backend. Den vet ikke hvilken kode som kjører i nettleseren og hvilken som kjører på serveren. Når du ber den fikse CORS, endrer AI ofte frontend (legger til mode: 'no-cors' i fetch) eller endrer serverkode på måter som ødelegger alt annet.

Det verste AI gjør:

Når ting går i stykker, reagerer folk naturlig: de fortsetter å prompte. «Fiks dette.» «Nå fungerer ikke det.» «Angre siste endring, men behold CORS-fiksen.» Hver nye prompt gjør ting verre fordi AI ikke husker hvorfor koden så ut som den gjorde.

CORS-kaskaden

Å la AI «fikse CORS» skrev om serverkoden, ødela importer, databasespørringer og svarsformater. Tre dager på å angre det AI gjorde på sekunder. Ikke fortsett å prompte — stopp opp og forstå problemet.

03

Steg-for-steg-fiks

Steg 1: Sjekk den virkelige feilen

De fleste ser på CORS-feilen i nettleserkonsollen og antar at det er et CORS-problem. Men ofte er den virkelige feilen et annet sted. Åpne Network-fanen i DevTools, ikke Console.

Finn den mislykkede forespørselen. Klikk på den og sjekk svarkoden. Hvis du ser 500 Internal Server Error, krasjet serveren din — og fordi den krasjet, la den ikke til CORS-headere i svaret. Nettleseren ser den manglende Access-Control-Allow-Origin-headeren og viser en CORS-feil, men det virkelige problemet er en serverfeil.

Hvis endpointet feiler (500), legges Access-Control-Allow-Origin vanligvis ikke til. Fiks serverfeilen, og «CORS-feilen» forsvinner av seg selv.

Steg 2: Riktig måte å konfigurere CORS på (Express.js)

Slik bør et CORS-middleware se ut på en Express.js-server. Legg merke til at vi setter spesifikke domener i stedet for wildcards, håndterer OPTIONS-forespørselen og setter credentials:

✓ Korrekt CORS-konfigurasjon
cors-middleware.js
const allowedOrigins = ['https://yourapp.com', 'https://app.yourapp.com'];

function corsMiddleware(req, res, next) {
  const origin = req.headers.origin;
  if (allowedOrigins.includes(origin)) {
    res.setHeader('Access-Control-Allow-Origin', origin);
    res.setHeader('Access-Control-Allow-Methods',
      'GET, POST, PUT, DELETE, OPTIONS');
    res.setHeader('Access-Control-Allow-Headers',
      'Content-Type, Authorization');
    res.setHeader('Access-Control-Allow-Credentials',
      'true');
  }
  if (req.method === 'OPTIONS')
    return res.status(204).end();
  next();
}

Steg 3: Hva AI genererer (feil)

Og her er hva AI vanligvis genererer når du ber den «fikse CORS». Det ser enkelt ut, men er fullt av problemer:

✗ Hva AI genererer
server.js
app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*');
  next();
});
// No OPTIONS handling
// Wildcard in production
// No credentials support
// No Allow-Methods or Allow-Headers

Forskjellene er kritiske: wildcard * betyr at hvilken som helst nettside i verden kan sende forespørsler til API-et ditt. Ingen OPTIONS-håndtering betyr at preflight-forespørsler ikke vil fungere. Ingen Allow-Credentials betyr at cookies og tokens ikke sendes. Dette er ikke «fikset» — det er et åpent sikkerhetshull.

Steg 4: CORS i Supabase Edge Functions

Hvis du bruker Supabase Edge Functions (Deno), må CORS håndteres manuelt i hver funksjon — eller, enda bedre, sentraliseres i en enkelt hjelpefil. Her er det korrekte mønsteret:

✓ Supabase Edge Function med CORS
supabase/functions/my-function/index.ts
const corsHeaders = {
  'Access-Control-Allow-Origin': 'https://yourapp.com',
  'Access-Control-Allow-Methods': 'POST, OPTIONS',
  'Access-Control-Allow-Headers':
    'Content-Type, Authorization',
};

Deno.serve(async (req) => {
  if (req.method === 'OPTIONS')
    return new Response(null, {
      status: 204,
      headers: corsHeaders
    });

  // Your logic here
  const data = { message: 'Hello' };

  return new Response(
    JSON.stringify(data),
    {
      headers: {
        ...corsHeaders,
        'Content-Type': 'application/json'
      }
    }
  );
});

Steg 5: Sentraliser CORS-konfigurasjonen

Én fil, ett sted. CORS-konfigurasjon bør leve på ett sted i hele prosjektet — ikke spredd over hvert endpoint og hver funksjon. Opprett en cors.js (eller cors.ts) fil og importer den overalt der den trengs.

Samtidig, lås fast JSON-svarsformatet — hvert endpoint bør returnere data i samme format. Hold inngangsfilen liten — den bør bare importere middleware og starte serveren. All forretningslogikk går i separate filer.

På denne måten, når du trenger å endre tillatte origins eller legge til en ny header, gjør du det på ett sted, og endringen fungerer overalt. Mangel på sentralisering er en av hovedgrunnene til at AI-apper fungerer lokalt men feiler i produksjon.

Steg 6: Feilsøk vanskelige tilfeller

Noen ganger ser alt korrekt ut og CORS fungerer fortsatt ikke. Her er de vanligste fellene:

04

Hva AI-verktøy gjør feil med CORS

AI-kodeverktøy — Cursor, Claude Code, Copilot og andre — er utrolig effektive til å generere kode. Men CORS er et område der de konsekvent feiler. Hvorfor? Fordi CORS er et konfigurasjons- og arkitekturproblem, ikke et kodelogikkproblem. AI er utmerket til å skrive logikk. Den forstår driftsettingskontekst dårlig.

Her er de gjentakende mønstrene jeg ser hos kunder:

Den beste strategien: ikke be AI fikse CORS. Forstå problemet selv, skriv konfigurasjonen manuelt (eller bruk koden fra denne artikkelen), og si til AI at den skal holde seg unna konfigurasjonsfiler.

05

Produksjonsklar CORS-sjekkliste

Før du ruller ut applikasjonen din, gå gjennom disse punktene. Hver av dem er en potensiell kilde til CORS-feil i produksjon. Hvis en ikke er oppfylt, kan appen din gå i stykker på måter som er vanskelige å diagnostisere.

06

Ofte stilte spørsmål

Hvorfor fungerer appen min på localhost, men får CORS-feil i produksjon?

På localhost kjører frontend og backend vanligvis på samme adresse (f.eks. http://localhost:3000), så nettleseren behandler det som same-origin og anvender ikke CORS-regler. Etter utrulling er frontend og backend på ulike domener — det er cross-origin og nettleseren begynner å sjekke CORS-headere. I tillegg bruker mange rammeverk en dev-proxy som maskerer cross-origin — den proxyen finnes ikke i produksjon.

Bør jeg bruke Access-Control-Allow-Origin: * ?

Bare for helt offentlige API-er som ikke krever autentisering — f.eks. offentlige værdata eller valutakurser. I alle andre tilfeller, bruk en liste med spesifikke domener. Husk: wildcard * og Access-Control-Allow-Credentials: true kan ikke eksistere sammen. Nettleseren avviser svaret. Hvis applikasjonen din bruker cookies, JWT-tokens eller noen form for sesjon, er wildcard ikke et alternativ.

Er CORS et frontend- eller backendproblem?

CORS er en backendkonfigurasjon som utløses av frontend. Feilen vises i nettleseren (frontend), men løsningen ligger på serveren (backend). Serveren må returnere riktige Access-Control-Allow-*-headere for at nettleseren skal tillate forespørselen. Du kan ikke «fikse CORS» med bare frontendkodeendringer — det eneste du kan gjøre på klientsiden er å skjule problemet (f.eks. mode: 'no-cors'), noe som er verre.

Hvorfor fungerer Postman, men ikke nettleseren min?

Postman er ikke en nettleser. Nettlesere håndhever CORS — API-klienter gjør det ikke. Postman, curl, Insomnia, server-til-server-forespørsler — ingen av dem sender preflight-forespørsler eller sjekker Access-Control-Allow-Origin-headere. Det er en ren nettlesermekanisme. Hvis API-et ditt fungerer i Postman men ikke i nettleseren, er det 100% et CORS-konfigurasjonsproblem på serveren — ikke selve API-et.

AI-en min fikset CORS, men nå er andre ting ødelagt

Dette er CORS-kaskaden. AI forstår ikke prosjektets kontekst. Når du ber den fikse CORS, endrer den ofte filer som ikke bør røres — endrer importer, modifiserer svarsformater, skriver om middleware. Hver nye fiks gjør ting verre. Løsningen: rull tilbake til tilstanden før AI-ens «fiks» (bruk git), forstå CORS-problemet ved hjelp av denne artikkelen, og skriv konfigurasjonen manuelt. Ikke la AI redigere CORS-konfigurasjonsfiler.

CORS fikset, men noe annet er ødelagt?

CORS-feil er ofte bare toppen av isfjellet. Hvis AI-appen din har problemer etter utrulling, la oss snakke — vi hjelper deg fra prototype til produksjon.

Bestill en gratis samtale →
Gratis konsultasjon Helt uforpliktende Svar innen 24t