CRUD-Operationen: Das Fundament jeder App
Create, Read, Update, Delete: Diese vier Operationen stecken in fast jeder Anwendung. Du lernst, wie CRUD in einer REST-API mit Node.js und Express konkret aussieht.
Egal ob Notiz-App, Online-Shop oder soziales Netzwerk: Im Kern machen die meisten Anwendungen immer dasselbe. Sie legen Daten an, lesen sie, ändern sie und löschen sie. Diese vier Grundoperationen fasst man unter dem Begriff CRUD zusammen. In diesem Beitrag zeige ich dir, was dahintersteckt und wie du CRUD in einer REST-API mit Node.js und Express umsetzt.
Was bedeutet CRUD?
CRUD steht für die vier zentralen Operationen auf Daten:
- Create – Neue Daten anlegen
- Read – Vorhandene Daten lesen
- Update – Bestehende Daten ändern
- Delete – Daten löschen
In einer REST-API werden diese Operationen typischerweise auf HTTP-Methoden abgebildet: POST zum Erstellen, GET zum Lesen, PUT oder PATCH zum Ändern und DELETE zum Löschen.
Grundgerüst mit Express
Wir bauen eine kleine API für Aufgaben (Tasks). Zunächst das Grundgerüst mit einer einfachen Liste als Datenspeicher:
const express = require("express");
const app = express();
app.use(express.json());
let tasks = [
{ id: 1, titel: "Einkaufen", erledigt: false }
];
let naechsteId = 2;
app.listen(3000, () => console.log("Server laeuft auf Port 3000"));Mit express.json() sorgst du dafür, dass der Body eingehender Anfragen automatisch als JSON gelesen wird. Die Variable tasks dient hier als einfacher Speicher im Arbeitsspeicher.
Create: Daten anlegen
Zum Anlegen nutzt du die HTTP-Methode POST. Die neuen Daten kommen im Request-Body an:
app.post("/tasks", (req, res) => {
const neuerTask = {
id: naechsteId++,
titel: req.body.titel,
erledigt: false
};
tasks.push(neuerTask);
res.status(201).json(neuerTask);
});Beachte den Statuscode 201. Er signalisiert, dass eine neue Ressource erfolgreich erstellt wurde. Die angelegte Aufgabe wird direkt zurückgegeben.
Read: Daten lesen
Beim Lesen unterscheidest du oft zwischen einer Liste aller Einträge und einem einzelnen Eintrag per ID:
// Alle Aufgaben
app.get("/tasks", (req, res) => {
res.json(tasks);
});
// Eine bestimmte Aufgabe
app.get("/tasks/:id", (req, res) => {
const task = tasks.find(t => t.id === Number(req.params.id));
if (!task) {
return res.status(404).json({ fehler: "Nicht gefunden" });
}
res.json(task);
});Wichtig ist die Behandlung des Falls, dass nichts gefunden wird. Dann antwortest du mit Statuscode 404, statt einfach undefined zurückzugeben.
Update und Delete
Zum Ändern verwendest du PUT (oder PATCH), zum Löschen DELETE:
// Aufgabe aktualisieren
app.put("/tasks/:id", (req, res) => {
const task = tasks.find(t => t.id === Number(req.params.id));
if (!task) return res.status(404).json({ fehler: "Nicht gefunden" });
task.titel = req.body.titel ?? task.titel;
task.erledigt = req.body.erledigt ?? task.erledigt;
res.json(task);
});
// Aufgabe loeschen
app.delete("/tasks/:id", (req, res) => {
tasks = tasks.filter(t => t.id !== Number(req.params.id));
res.status(204).send();
});Der Operator ?? behält den alten Wert, falls im Body kein neuer mitgeschickt wurde. Beim Löschen antwortest du mit 204 (No Content), weil es nichts zurückzugeben gibt.
CRUD und die Datenbank
In echten Anwendungen liegt der Speicher nicht im Arbeitsspeicher, sondern in einer Datenbank. Die CRUD-Logik bleibt aber identisch, nur die Datenzugriffe ändern sich:
// Statt tasks.push(...) mit einer Datenbank
app.post("/tasks", async (req, res) => {
const neuerTask = await db.tasks.create({
data: { titel: req.body.titel, erledigt: false }
});
res.status(201).json(neuerTask);
});So wandert dasselbe Muster nahtlos von einem Prototyp in eine produktive Anwendung mit echter Datenhaltung.
Fazit
CRUD ist das Fundament fast jeder Anwendung. Wenn du Create, Read, Update und Delete sauber auf HTTP-Methoden und Statuscodes abbildest, hast du das Grundmuster jeder REST-API verstanden. Baue dir die Task-API einmal selbst nach und teste sie mit einem Tool wie curl oder Postman. Danach fällt dir jede neue API deutlich leichter.