← Startsida

Så fixar du CORS-fel i AI-genererade appar

CORS är en webbläsarmekanism, inte ett serverfel. Därför fungerar Postman men din driftsatta app gör det inte. Den här guiden visar steg för steg hur du löser det på rätt sätt.

⏱ 15 min läsning

CORS är en webbläsarmekanism. Varje gång din app försöker skicka en förfrågan till en annan host frågar webbläsaren servern om det är tillåtet. Det är inte en bugg i din kod — det är ett säkerhetslager inbyggt i varje webbläsare. Problemet är att de flesta aldrig lärde sig hur det fungerar.

AI-genererad kod plus publik driftsättning är där de flesta bränner sig. På localhost fungerade allt eftersom frontend och backend levde på samma adress. Efter driftsättning — de är på olika domäner och webbläsaren blockerar förfrågningarna.

Den här artikeln är en praktisk steg-för-steg-guide. Vi förklarar vad CORS egentligen är, varför AI-verktyg gör det värre, och hur du fixar det en gång för alla — med kod du kan kopiera och använda direkt.

01

Vad CORS egentligen är

CORS (Cross-Origin Resource Sharing) är en säkerhetsmekanism i webbläsaren, inte ett serverfel. Så här fungerar det: varje gång din applikation försöker skicka en HTTP-förfrågan till en annan origin (en annan domän, port eller protokoll) frågar webbläsaren först målservern om det är tillåtet.

På localhost kör din frontend och backend vanligtvis på samma adress — till exempel http://localhost:3000. Det är same-origin — samma domän, samma port, samma protokoll. Webbläsaren ser inget problem eftersom förfrågan går till samma host. Det är därför allt fungerar under utveckling.

Efter driftsättning lever din frontend på https://minapp.com och din backend på https://api.minapp.com eller en helt annan domän. Det är cross-origin. Och där kliver webbläsaren in.

Innan webbläsaren skickar din faktiska förfrågan (POST, PUT, DELETE) skickar den först en så kallad preflight-förfrågan — en OPTIONS-förfrågan till samma URL. Den frågar i princip: «Hej server, får frontend från domän X skicka POST-förfrågningar med dessa headers?» Om servern inte svarar med rätt CORS-headers blockerar webbläsaren förfrågan innan den ens skickas.

Det viktigaste att förstå: CORS är en webbläsarmekanism. Postman, curl, server-till-server-förfrågningar — ingen av dem tillämpar CORS. Därför kan ditt API fungera perfekt i Postman medan det kastar fel i webbläsaren. Det är inte en API-bugg — det är webbläsaren som gör sitt jobb.

CORS

CORS är en webbläsarmekanism. Varje gång du försöker skicka en förfrågan till en annan host frågar din webbläsare om det är tillåtet. Därför fungerar Postman men din webbläsare gör det inte — Postman är inte en webbläsare och tillämpar inte denna regel.

02

CORS-kaskaden: så gör AI det värre

Här är det typiska scenariot: du ser ett CORS-fel i konsolen. Du säger till AI «fixa CORS». AI ändrar något i serverkoden. CORS-felet försvinner — men nu är något annat trasigt. Du säger till AI «fixa det». AI skriver om en annan del av koden. Och så börjar kaskaden.

Jag har sett det här på första hand hos kunder: att låta AI «fixa CORS» skrev om serverkoden, förstörde importer, databasfrågor och svarsformatering. Tre dagar att ångra det som AI gjorde på sekunder.

Problemet är fundamentalt: AI förstår inte gränsen mellan frontend och backend. Den vet inte vilken kod som kör i webbläsaren och vilken som kör på servern. När du ber den fixa CORS ändrar AI ofta frontend (lägger till mode: 'no-cors' i fetch) eller ändrar serverkoden på sätt som förstör allt annat.

Det värsta AI gör:

När saker går sönder reagerar folk naturligt: de fortsätter prompta. «Fixa det här.» «Nu fungerar inte det där.» «Ångra senaste ändringen men behåll CORS-fixen.» Varje ny prompt gör saken värre eftersom AI inte minns varför koden såg ut som den gjorde.

CORS-kaskaden

Att låta AI «fixa CORS» skrev om serverkoden, förstörde importer, databasfrågor och svarsformat. Tre dagar att ångra det AI gjorde på sekunder. Fortsätt inte prompta — stanna upp och förstå problemet.

03

Steg-för-steg-fix

Steg 1: Kontrollera det verkliga felet

De flesta tittar på CORS-felet i webbläsarens konsol och antar att det är ett CORS-problem. Men ofta är det verkliga felet någon annanstans. Öppna fliken Network i DevTools, inte Console.

Hitta den misslyckade förfrågan. Klicka på den och kontrollera svarskoden. Om du ser 500 Internal Server Error kraschade din server — och eftersom den kraschade lade den inte till CORS-headers i svaret. Webbläsaren ser den saknade Access-Control-Allow-Origin-headern och visar ett CORS-fel, men det verkliga problemet är ett serverfel.

Om endpointen ger fel (500) läggs Access-Control-Allow-Origin vanligtvis inte till. Fixa serverfelet, så försvinner «CORS-felet» av sig självt.

Steg 2: Rätt sätt att konfigurera CORS (Express.js)

Här är hur ett CORS-middleware borde se ut på en Express.js-server. Notera att vi anger specifika domäner istället för wildcards, hanterar OPTIONS-förfrågan och ställer in credentials:

✓ Korrekt CORS-konfiguration
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: Vad AI genererar (fel)

Och här är vad AI vanligtvis genererar när du ber den «fixa CORS». Det ser enkelt ut, men det är fullt av problem:

✗ Vad AI genererar
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

Skillnaderna är kritiska: wildcard * innebär att vilken webbplats som helst i världen kan skicka förfrågningar till ditt API. Ingen OPTIONS-hantering innebär att preflight-förfrågningar inte fungerar. Ingen Allow-Credentials innebär att cookies och tokens inte skickas. Det här är inte «fixat» — det är ett öppet säkerhetshål.

Steg 4: CORS i Supabase Edge Functions

Om du använder Supabase Edge Functions (Deno) måste CORS hanteras manuellt i varje funktion — eller, ännu bättre, centraliseras i en enda hjälpfil. Här är det korrekta mönstret:

✓ 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: Centralisera CORS-konfigurationen

En fil, ett ställe. CORS-konfigurationen borde leva på ett ställe i hela ditt projekt — inte utspridd över varje endpoint och varje funktion. Skapa en cors.js (eller cors.ts) fil och importera den överallt där den behövs.

Samtidigt, lås fast JSON-svarsformatet — varje endpoint borde returnera data i samma format. Håll din ingångsfil liten — den borde bara importera middleware och starta servern. All affärslogik går i separata filer.

På så sätt, när du behöver ändra tillåtna origins eller lägga till en ny header, gör du det på ett ställe, och ändringen fungerar överallt. Brist på centralisering är en av huvudorsakerna till att AI-appar fungerar lokalt men misslyckas i produktion.

Steg 6: Felsök knepiga fall

Ibland ser allt korrekt ut och CORS fungerar ändå inte. Här är de vanligaste fällorna:

04

Vad AI-verktyg gör fel med CORS

AI-kodverktyg — Cursor, Claude Code, Copilot och andra — är otroligt effektiva på att generera kod. Men CORS är ett område där de konsekvent misslyckas. Varför? Därför att CORS är ett konfigurations- och arkitekturproblem, inte ett kodlogikproblem. AI är utmärkt på att skriva logik. Den förstår driftsättningskontext dåligt.

Här är de återkommande mönstren jag ser hos kunder:

Den bästa strategin: be inte AI fixa CORS. Förstå problemet själv, skriv konfigurationen manuellt (eller använd koden från den här artikeln) och säg till AI att hålla sig borta från konfigurationsfiler.

05

Produktionsklar CORS-checklista

Innan du driftsätter din applikation, gå igenom dessa punkter. Var och en är en potentiell källa till CORS-fel i produktion. Om en inte är uppfylld kan din app gå sönder på sätt som är svåra att diagnostisera.

06

Vanliga frågor

Varför fungerar min app på localhost men får CORS-fel i produktion?

På localhost kör frontend och backend vanligtvis på samma adress (t.ex. http://localhost:3000), så webbläsaren behandlar det som same-origin och tillämpar inte CORS-regler. Efter driftsättning är frontend och backend på olika domäner — det är cross-origin och webbläsaren börjar kontrollera CORS-headers. Dessutom använder många ramverk en dev-proxy som maskerar cross-origin — den proxyn finns inte i produktion.

Borde jag använda Access-Control-Allow-Origin: * ?

Bara för helt publika API:er som inte kräver autentisering — t.ex. publika väderdata eller växelkurser. I alla andra fall, använd en lista med specifika domäner. Kom ihåg: wildcard * och Access-Control-Allow-Credentials: true kan inte samexistera. Webbläsaren avvisar svaret. Om din applikation använder cookies, JWT-tokens eller någon form av session är wildcard inte ett alternativ.

Är CORS ett frontend- eller backendproblem?

CORS är en backendkonfiguration som utlöses av frontend. Felet dyker upp i webbläsaren (frontend), men lösningen finns på servern (backend). Servern måste returnera korrekta Access-Control-Allow-*-headers för att webbläsaren ska tillåta förfrågan. Du kan inte «fixa CORS» enbart med ändringar i frontendkoden — det enda du kan göra på klientsidan är att dölja problemet (t.ex. mode: 'no-cors'), vilket är värre.

Varför fungerar Postman men inte min webbläsare?

Postman är inte en webbläsare. Webbläsare tillämpar CORS — API-klienter gör det inte. Postman, curl, Insomnia, server-till-server-förfrågningar — ingen av dem skickar preflight-förfrågningar eller kontrollerar Access-Control-Allow-Origin-headers. Det är en ren webbläsarmekanism. Om ditt API fungerar i Postman men inte i webbläsaren är det 100% ett CORS-konfigurationsproblem på servern — inte själva API:et.

Min AI fixade CORS men nu är andra saker trasiga

Det här är CORS-kaskaden. AI förstår inte ditt projekts kontext. När du ber den fixa CORS ändrar den ofta filer som inte borde röras — ändrar importer, modifierar svarsformat, skriver om middleware. Varje ny fix gör saken värre. Lösningen: rulla tillbaka till tillståndet före AI:s «fix» (använd git), förstå CORS-problemet med hjälp av den här artikeln, och skriv konfigurationen manuellt. Låt inte AI redigera CORS-konfigurationsfiler.

CORS fixat men något annat är trasigt?

CORS-fel är ofta bara toppen av isberget. Om din AI-app har problem efter driftsättning, låt oss prata — vi hjälper dig från prototyp till produktion.

Boka ett gratis samtal →
Gratis konsultation Utan förpliktelser Svar inom 24h