====== LU15c – Erster Express-Server mit Node.js ======
===== Learning Objectives =====
* Sie können einen einfachen **Express-Server** programmieren.
* Sie können den Server über das Terminal starten.
* Sie verstehen den **Request-Response-Zyklus** (''app.get'', ''res.send'').
* Sie können erklären, warum dies **kein klassisches Website-Frontend**, sondern ein **Backend-Server / API** ist.
* Sie kennen ''nodemon'' und einfache ''npm scripts'' für einen komfortablen Entwicklungsablauf.
===== Unser erster Express-Server =====
Öffnen Sie die Datei ''index.js'' und fügen Sie folgenden Code ein:
import express from 'express';
const app = express();
const port = 3000;
// Route für GET-Anfragen auf "/"
app.get('/', (req, res) => {
res.send('Hello World');
});
// Server starten und auf Port 3000 auf Anfragen warten
app.listen(port, () => {
console.log(`Example app listening on port ${port}`);
});
**Was passiert in diesem Code?**
* ''import express from 'express';'' -> Lädt das Express-Framework aus ''node_modules''.
* ''const app = express();'' -> Erstellt eine neue Express-Anwendung – das ist Ihr Serverobjekt.
* ''const port = 3000;'' -> Definiert den Port, auf dem der Server lauscht.
* ''app.get('/', (req, res) => { ... });'' -> Definiert eine **Route**:
* Wenn eine **GET-Anfrage** an ''/'' kommt,
* führt Express die Callback-Funktion aus.
* ''req'' = Request-Objekt (Infos über Anfrage),
''res'' = Response-Objekt (Antwort, die Sie zurückschicken).
* ''res.send('test');'' → sendet den Text ''Hello World'' als Antwort zurück an den Browser oder Postman.
* ''app.listen(port, () => { ... });'' -> Startet den Server und gibt im Terminal eine kurze Meldung aus.
{{:modul:m290_guko:learningunits:lu15:theorie:client_server_nodejs_http_req_response.png?direct&900|}}
//Das Schema zeigt, wie ein Zusammenspiel aus Anfrage (Request) und Antwort (Response) zwischen Client und Server funktioniert.//
===== Server starten und im Browser testen =====
- Öffnen Sie in WebStorm das **Terminal** (Projektordner).
- Starten Sie den Server mit:
node index.js
- Im Terminal sollte erscheinen: ''Example app listening on port 3000''
- Öffnen Sie Ihren Browser und geben Sie ein: ''http://localhost:3000/''
- Sie sollten nur das Wort **''Hello World''** im Browser sehen.
- Server stoppen: Im Terminal ''Strg + C'' (Windows/Linux) oder ''ctrl + C'' (macOS) drücken.
===== Wichtig: Wir haben keinen „klassischen“ Webauftritt programmiert =====
**Zentrale Idee**
Sie haben in dieser Learning Unit **kein HTML**, **kein CSS** und **kein JavaScript für den Browser** geschrieben.
Sie haben **JavaScript für den Server** geschrieben.
* Der Browser spielt hier nur die Rolle eines **Clients**, der eine Anfrage an Ihren Server sendet.
* Der Express-Server beantwortet diese Anfrage mit einer Antwort (''Response'').
* Der Browser zeigt einfach an, was im **Response-Body** steht (in unserem Fall der Text ''Hello World.'').
Später werden Sie:
* statt einfachem Text **JSON-Daten** zurückgeben,
* mehrere Routen (z.B. ''/api/trips'', ''/api/books'') definieren,
* und diese mit Ihrer **MySQL-Datenbank** verbinden.
===== Entwickler-Komfort: npm-Scripts & nodemon =====
Wenn Sie nach jeder Codeänderung den Server mit ''node index.js'' neu starten müssen, ist das mühsam.
Dafür gibt es zwei Hilfsmittel:
* **''npm scripts''** in ''package.json''
* **''nodemon''** für automatischen Neustart
==== 1. nodemon installieren ====
Installieren Sie ''nodemon'' als Entwicklungs-Tool:
npm install --save-dev nodemon
Dadurch ergänzt ''npm'' Ihre ''package.json'' um einen Eintrag unter ''devDependencies'' für ''nodemon''.
**Was bedeutet ''devDependencies''?**
In ''package.json'' gibt es zwei wichtige Bereiche für Pakete:
* ''dependencies'' → Pakete, die Ihre Anwendung **zum Ausführen** braucht (z.B. ''express''). Ohne diese Pakete kann der Server in Produktion nicht laufen.
* ''devDependencies'' → Pakete, die Sie **nur während der Entwicklung** brauchen (z.B. Test-Frameworks, Build-Tools – und ''nodemon'').
''nodemon'' ist ein typisches **Entwicklungs-Tool**:
Es hilft Ihnen beim Programmieren (automatischer Neustart bei Änderungen), wird aber auf einem späteren Produktionsserver **nicht benötigt**.
Darum speichern wir es mit ''--save-dev'' in den ''devDependencies''.
{{:modul:m290_guko:learningunits:lu15:theorie:screenshot_2025-12-08_at_08.45.36.png?direct&700|}}
==== 2. Scripts in ''package.json'' ergänzen ====
Öffnen Sie ''package.json'' und ergänzen Sie den Abschnitt ''scripts'' wie folgt (Beispiel, wie im Screenshot oben):
"scripts": {
"start": "node index.js",
"dev": "nodemon index.js"
}
Damit definieren Sie zwei Startvarianten:
* **''npm start''**
- Startet den Server mit ''node index.js''.
- Der Prozess läuft „ganz normal“ ohne automatischen Neustart.
- Das entspricht eher einem **Produktivbetrieb**: Der Server läuft stabil, Änderungen am Code erfordern ein manuelles Neustarten.
* **''npm run dev''**
- Startet den Server mit ''nodemon index.js''.
- ''nodemon'' beobachtet Ihre Dateien und startet den Server **automatisch neu**, wenn Sie etwas ändern und speichern.
- Das ist ideal für die **Entwicklung im Unterricht**, weil Sie sofort die Wirkung Ihrer Änderungen sehen.
Wenn Sie nun in ''index.js'' (oder Ihrer Server-Datei) etwas ändern und speichern, startet ''nodemon'' den Server bei **''npm run dev''** automatisch neu.
Sie müssen ''node index.js'' nicht jedes Mal von Hand ausführen.
===== node_modules & IDE-Hinweise =====
* Der Ordner ''node_modules/'' kann sehr gross werden. Er wird von ''npm'' automatisch verwaltet und muss **nicht** manuell bearbeitet werden.
* Für Abgaben (z.B. in Moodle) reicht meist:
* Quellcode-Dateien (z.B. ''index.js'')
* ''package.json'' (und optional ''package-lock.json'')
* In WebStorm können Sie bei Bedarf die **Inlay-Hints** (kleine Typ-Hinweise) deaktivieren, wenn diese Sie stören (''Settings → Editor → Inlay Hints'').
In den nächsten Learning Units werden Sie:
* weitere Routen in Ihrem Express-Server anlegen,
* Daten nicht nur zurückgeben, sondern auch **annehmen** (''POST'', ''PUT'', ''DELETE''),
* Ihre **persönlichen Use Cases** (z.B. Reisedatenbank, Lieblingsfilme, Geburtstage) mit einer echten MySQL-Datenbank verbinden und alle CRUD-Operationen **über den Backend-Server** ausführen.