Wat is het probleem?
Je backend draait op http://localhost:4000. Je React-frontend straks op
http://localhost:5173. Zodra je frontend data ophaalt van je backend, krijg je deze error:
CORS Error:
Access to fetch at 'http://localhost:4000/api/workouts' from origin
'http://localhost:5173' has been blocked by CORS policy
Wat is CORS?
CORS = Cross-Origin Resource Sharing.
Probleem: backend (poort 4000) en frontend (poort 5173) draaien op verschillende poorten. Voor de browser zijn dat verschillende "origins" en die mogen elkaar niet zomaar aanroepen.
Oplossing: de backend geeft expliciet toestemming aan de frontend. Dat doe je met de
cors package.
CORS installeren
In je backend/ map:
npm install cors
CORS toevoegen aan server.js
import express from 'express';
import cors from 'cors';
import workoutRoutes from './routes/workoutRoutes.js';
const app = express();
// CORS toestaan voor frontend — VOOR alle andere middleware
app.use(cors({
origin: 'http://localhost:5173'
}));
// Middleware voor JSON
app.use(express.json());
// Routes
app.use('/api/workouts', workoutRoutes);
app.use(cors(...))— staat cross-origin requests toe.origin: 'http://localhost:5173'— alleen deze URL mag bij je API.- Dit moet vóór
app.use(express.json())en vóór je routes.
Herstart je backend!
Na deze wijziging moet je server opnieuw starten (Ctrl+C en opnieuw
npm run dev). Anders blijft de oude config draaien.
Zie het in actie — wat CORS écht doet
Je hebt nu de fix gezien. Maar wat doet die app.use(cors()) regel eigenlijk? Toggle hieronder tussen met en zonder CORS en zie het verschil.
Het misverstand dat we even rechtzetten:
Studenten denken vaak dat CORS de request blokkeert. Maar nee — de request gaat gewoon naar de server. De server ontvangt 'm. De server stuurt een response. Het is de BROWSER zelf die de response blokkeert als de juiste headers ontbreken.
Daarom werkt je backend prima als je 'm test met Postman of curl: die hebben geen CORS-check. Alleen browsers doen dat, voor security redenen.
Wat app.use(cors()) doet: het voegt de Access-Control-Allow-Origin: * header toe aan elke response. Zo weet de browser: "ja, deze server staat het toe dat mijn JavaScript op een ander domein 'm aanroept".
Testen
Doe een fetch vanuit je frontend (of een browser-console op localhost:5173):
fetch('http://localhost:4000/api/workouts')
.then(res => res.json())
.then(data => console.log(data));
Het werkt!
Geen rode CORS-error meer in de browser-console. Je ziet je data verschijnen.
Veelvoorkomende problemen
1. Nog steeds een CORS error
- Backend herstart?
Ctrl+Cen opnieuwnpm run dev. - URL klopt? Check of je
origin: 'http://localhost:5173'hebt staan, niet5174of een ander poortnummer. - Heeft Vite een andere poort gekozen omdat 5173 bezet was? Pas dan de origin aan.
2. CORS staat nu helemaal open voor iedereen
In productie wil je dat niet. Voor lokaal ontwikkelen is een specifieke origin (zoals hierboven) prima.
3. cors() zonder opties
Dat staat alle origins toe. Werkt wel maar is onveilig. Liever expliciet je frontend-URL opgeven.
Volgende stappen
CORS staat. Tijd om je React-frontend te bouwen.
Frontend Setup
Vite-project naast je backend en eerste verbindingstest.
DataLijst Tonen (GET)
Data ophalen en tonen in losse componenten.
Of bekijk het hele overzicht onder Frontend (React ↔ jouw backend) op de MERN-startpagina.