Modul 295 | Block 01¶
Einführung¶
🟢 Node.js Einführung: Kernkonzepte¶
Definition: Node.js ist eine Open-Source JavaScript-Laufzeitumgebung, die auf der Chrome V8 Engine basiert und Code serverseitig ausserhalb des Browsers ausführt.
🛠 Die Architektur¶
-
Single-Threaded: Alle Operationen laufen in einem einzigen Prozess ab.
-
Event-Loop: Das Herzstück von Node.js, das Aufgaben effizient delegiert.
-
Non-Blocking I/O: - Bei Datenbankanfragen oder Dateizugriffen wartet Node.js nicht (blockiert nicht).
-
Stattdessen wird die Arbeit fortgesetzt, bis die Antwort bereitsteht.
🚀 Warum Node.js nutzen?¶
| Feature | Beschreibung |
|---|---|
| Full-Stack | Eine Sprache (JavaScript) für Client und Server nutzen. |
| Performance | Extrem schnell durch die V8 Engine und asynchrone Verarbeitung. |
| Skalierbarkeit | Kann tausende gleichzeitige Verbindungen ohne hohen RAM-Verbrauch händeln. |
| Modernes JS | Neueste ECMAScript-Features (ES6+) sind direkt verfügbar. |
💻 Hello World Webserver¶
Dies ist das absolute Minimalbeispiel für deine Doku:
JavaScript
// 1. HTTP Modul importieren
const { createServer } = require('node:http');
// 2. Server-Logik definieren
const server = createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Node.js Doku-Test erfolgreich');
});
// 3. Port binden und starten
server.listen(3000, '127.0.0.1', () => {
console.log('Server läuft auf http://127.0.0.1:3000/');
});
📝 Key Takeaways für Entwickler¶
-
Kein Multithreading-Chaos: Keine Sorgen um Deadlocks, da ein einzelner Thread genutzt wird.
-
npm-Ökosystem: Zugriff auf Millionen von Bibliotheken für fast jede Aufgabe.
-
Flexibilität: Perfekt für Echtzeit-Apps (Chat, Streaming) und Microservices.
synchron vs. asynchron¶
In Node.js ist das Verständnis dieses Unterschieds entscheidend, da die Plattform auf Nicht-blockierendem I/O aufbaut.
Synchroner Code (Blockierend)¶
Bei synchronem Code wird jede Zeile nacheinander abgearbeitet. Der Prozess "wartet", bis eine Aufgabe erledigt ist, bevor er zur nächsten springt.
const fs = require('node:fs');
console.log("Start: Lese Datei...");
// Der Prozess bleibt hier stehen, bis die Datei fertig gelesen ist
const data = fs.readFileSync('beispiel.txt', 'utf8');
console.log("Inhalt der Datei:", data);
console.log("Ende: Ich musste warten.");
Das Problem bei Synchronität
Wenn die Datei sehr gross ist oder die Datenbank langsam antwortet, steht die gesamte Anwendung still. Kein anderer User kann in dieser Zeit bedient werden.
Asynchroner Code (Nicht-blockierend)
Asynchroner Code erlaubt es Node.js, eine Aufgabe zu starten und sofort mit der nächsten weiterzumachen, ohne auf das Ergebnis zu warten. Sobald die Aufgabe fertig ist, wird eine Callback-Funktion aufgerufen.
const fs = require('node:fs');
console.log("Start: Lese Datei asynchron...");
// Node.js startet den Lesevorgang und geht sofort weiter
fs.readFile('beispiel.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log("Inhalt der Datei (später fertig):", data);
});
console.log("Ende: Ich habe nicht gewartet!");
Der Ablauf in der Konsole
Im asynchronen Beispiel wirst du in der Konsole sehen, dass "Ende: Ich habe nicht gewartet!" erscheint, bevor der Inhalt der Datei ausgegeben wird. Das liegt daran, dass der Lesevorgang im Hintergrund läuft (Event Loop), während der Hauptthread bereits die nächste Zeile ausführt.
Vergleich der Konsolenausgaben
| Schritt | Synchroner Ablauf (Output) | Asynchroner Ablauf (Output) |
|---|---|---|
| 1 | Start: Lese Datei... |
Start: Lese Datei asynchron... |
| 2 | Inhalt der Datei: [Text...] |
Ende: Ich habe nicht gewartet! |
| 3 | Ende: Ich musste warten. |
Inhalt der Datei (später fertig): [Text...] |
Zusammenfassung für die Dokumentation
| Merkmal | Synchron (Sync) | Asynchron (Async) |
|---|---|---|
| Ablauf | Streng nacheinander | Parallel / Zeitversetzt |
| Performance | Blockiert den Thread | Hohe Skalierbarkeit |
| Anwendung | Skripte, Initialisierung | Server-Anfragen, I/O |
Webserver¶
Programmstruktur und Komponenten
Der Server wird in drei wesentlichen Schritten initialisiert. Die folgende Tabelle erläutert die verwendeten Kernkomponenten:
| Komponente | Funktion | Beschreibung |
|---|---|---|
require('http') |
Modul-Import | Lädt das integrierte Node.js-Modul für Netzwerkfunktionen. |
createServer() |
Server-Instanz | Erstellt einen Server, der auf eingehende Events reagiert. |
req (Request) |
Anfrage-Objekt | Enthält alle Daten des Clients (z. B. URL, Header). |
res (Response) |
Antwort-Objekt | Wird genutzt, um Daten an den Client zurückzusenden. |
listen() |
Aktivierung | Bindet den Server an eine IP-Adresse und einen Port. |
Funktionsweise (Theorie)
Ein Webserver fungiert als dauerhaft laufender Prozess, der auf Anfragen wartet. In Node.js geschieht dies eventbasiert.
IP-Adresse & Localhost
Die IP
127.0.0.1ist die Standard-Loopback-Adresse. Sie signalisiert dem System, dass die Netzwerkkommunikation auf demselben Gerät bleiben soll, auf dem auch der Server läuft. In der Entwicklung wird diese Adresse synonym mit dem Hostnamenlocalhostverwendet.
Ports
Ports dienen zur Identifizierung spezifischer Prozesse auf einem Host. Während Port 80 der Standard für HTTP ist, werden für die lokale Entwicklung oft freie Ports im Bereich über 1024 gewählt (z. B. 8000, 3000 oder 8080).
Implementierungsschritte
-
Einbindung des Moduls: Das
http-Modul stellt die MethodecreateServerbereit. -
Definition der Callback-Funktion: Diese Funktion wird jedes Mal ausgeführt, wenn eine neue Anfrage den Server erreicht.
-
Abschluss der Response: Mit
res.end('Inhalt')wird die Antwort an den Browser gesendet und die Verbindung geschlossen. Ohne diesen Befehl würde der Browser unendlich lange laden ("Hanging Request"). -
Starten des Listeners: Der Server wird angewiesen, auf Port
8000zu lauschen.
Beispiel-Code (Struktur)
const http = require('http');
const server = http.createServer((req, res) => {
res.end('Antwort vom Server');
});
server.listen(8000, '127.0.0.1', () => {
console.log('Server aktiv auf Port 8000');
});
Analyse der Objekte (Debug)
Um die interne Struktur der Kommunikation zu verstehen, können die Objekte
requndresin der Konsole ausgegeben werden.
-
req: Zeigt Details wie die Methode (GET, POST) und den Pfad (/). -
res: Zeigt den Status der Antwort und die Header, die an den Browser gesendet werden


