Een foutmelding lezen
Een foutmelding is geen straf, maar een hint. De computer vertelt je wat er mis is, en vaak ook waar.
Waar zie je de foutmelding?
- Backend: de terminal waar je server draait
- Frontend:
F12→ tabje Console, en het tabje Network om te zien wat je backend terugstuurt
Zo pak je het aan
- Lees de eerste rode regel. Die zegt wat er mis is
- Zoek de bestandsnaam en het regelnummer, bijv.
App.jsx:12. Daar zit de fout (of net een regel erboven) - Zoek je foutmelding hieronder op
Poort al in gebruik
Error: listen EADDRINUSE: address already in use :::4000
Wat betekent het? Er draait al iets op poort 4000. Meestal is het je eigen server, die nog in een andere terminal openstaat.
- Kijk of je nog een andere terminal hebt met de server erin → klik erin en druk op
Ctrl + C - Vind je hem niet? Stop alles wat op poort 4000 draait:
npx kill-port 4000
Cannot find package / module
Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'express' imported from /backend/server.js
Wat betekent het? Node kan een package of bestand niet vinden.
Een package (express, mongoose, …)? Dan is het niet geïnstalleerd. Check of je in de goede map staat (backend!) en doe:
npm install
Een eigen bestand? Bij import in Node moet .js erachter:
Fout:
import productRoutes from "./routes/productRoutes";
Goed:
import productRoutes from "./routes/productRoutes.js";
import outside a module
SyntaxError: Cannot use import statement outside a module
Wat betekent het? Node gebruikt standaard require(). Wil je import gebruiken, dan moet je dat aanzetten.
Zet in je package.json:
{
"type": "module"
}
MONGO_URI is undefined
MongooseError: The `uri` parameter to `openUri()` must be a string, got "undefined".
Wat betekent het? Je process.env.MONGO_URI is leeg. Je .env wordt niet geladen.
- Staat
import "dotenv/config";bovenaan inserver.js? - Staat
.envin de hoofdmap van je backend (naastpackage.json)? - Is de naam precies hetzelfde?
MONGO_URIin.envén in je code - Geen spaties of aanhalingstekens:
MONGO_URI=mongodb+srv://... - Server opnieuw gestart na het aanpassen van
.env?
Kan niet verbinden met Atlas
MongooseServerSelectionError: Could not connect to any servers in your MongoDB Atlas cluster. One common reason is that you're trying to access the database from an IP that isn't whitelisted.
Wat betekent het? MongoDB Atlas laat je niet binnen, omdat je IP-adres niet op de lijst staat. Dit gebeurt vaak als je van thuis naar school gaat (ander wifi = ander IP).
- Ga naar cloud.mongodb.com → je project
- Links: Network Access → Add IP Address
- Klik op Add Current IP Address → Confirm
- Wacht een minuutje en start je server opnieuw
Werkt het nog steeds niet? Check het wachtwoord in je MONGO_URI. Bevat het tekens als @ of #? Maak dan een nieuw wachtwoord zonder speciale tekens.
Blocked by CORS policy
Access to fetch at 'http://localhost:4000/api/products' from origin 'http://localhost:5173' has been blocked by CORS policy
Wat betekent het? Je frontend (poort 5173) mag van de browser niet zomaar praten met je backend (poort 4000). De backend moet toestemming geven.
npm install cors// server.js
import cors from "cors";
app.use(cors()); // vóór je routes!
app.use(express.json());
app.use("/api/products", productRoutes);
req.body is undefined
TypeError: Cannot destructure property 'name' of 'req.body' as it is undefined.
Wat betekent het? Express kan de data uit je request niet lezen.
Backend: heb je express.json() aangezet?
app.use(express.json()); // vóór je routes
Frontend: stuur je de data als JSON, mét header?
await fetch("http://localhost:4000/api/products", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ name, price }),
});
Cannot GET /api/...
Cannot GET /api/product
Wat betekent het? Express heeft geen route die bij deze URL en methode past.
- Spelling:
/api/productvs/api/products - Methode: je doet een
GET, maar de route isrouter.post(...). (Bij POST zie jeCannot POST) - Prefix: staat er
app.use("/api/products", productRoutes)inserver.js? - Server herstart? Zonder nodemon zie je nieuwe routes pas na opnieuw starten
ValidationError: Path is required
ValidationError: Product validation failed: name: Path `name` is required.
Wat betekent het? Je schema zegt dat name verplicht is, maar het zat niet in de data die je opslaat.
- Stuurt je frontend
nameecht mee? Check metconsole.log(req.body)in je controller - Spelling:
namein het schema,naamin je formulier? - Zie ook req.body is undefined
CastError: Cast to ObjectId failed
CastError: Cast to ObjectId failed for value "123" (type string) at path "_id" for model "Product"
Wat betekent het? Het id in je URL is geen geldig MongoDB-id. Een MongoDB-id ziet eruit als 66f1c2a9e4b0a1b2c3d4e5f6.
import mongoose from "mongoose";
export const getProduct = async (req, res) => {
const { id } = req.params;
if (!mongoose.isValidObjectId(id)) {
return res.status(400).json({ message: "Ongeldig id" });
}
const product = await Product.findById(id);
// ...
};
Check ook in je frontend of je wel product._id gebruikt (met underscore!).
Cannot set headers after they are sent
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
Wat betekent het? Je stuurt twee keer een antwoord in één route. Na res.json() gaat je code gewoon door.
Fout:
if (!product) {
res.status(404).json({ message: "Niet gevonden" });
}
res.json(product); // wordt óók uitgevoerd!
Goed:
if (!product) {
return res.status(404).json({ message: "Niet gevonden" });
}
res.json(product);
Zet return voor elke res. die vroeg in je functie staat.
JWT-fouten
Error: secretOrPrivateKey must have a value
Wat betekent het? Er gaat iets mis met je login-token.
| Foutmelding | Oplossing |
|---|---|
secretOrPrivateKey must have a value | JWT_SECRET staat niet in je .env (of .env wordt niet geladen) |
JsonWebTokenError: jwt malformed | Je stuurt geen geldige token. Check de header: Authorization: Bearer <token>, en of je de token goed uit localStorage haalt |
TokenExpiredError: jwt expired | De token is verlopen. Log opnieuw in |
JsonWebTokenError: invalid signature | De token is gemaakt met een ander JWT_SECRET. Log opnieuw in |