Zum Inhalt

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.1 ist 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 Hostnamen localhost verwendet.

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

  1. Einbindung des Moduls: Das http-Modul stellt die Methode createServer bereit.

  2. Definition der Callback-Funktion: Diese Funktion wird jedes Mal ausgeführt, wenn eine neue Anfrage den Server erreicht.

  3. 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").

  4. Starten des Listeners: Der Server wird angewiesen, auf Port 8000 zu 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 req und res in 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

Webserver auf dem Raspberry

Bildschirmfoto 2026-02-10 um 14.06.14.png

Bildschirmfoto 2026-02-10 um 14.12.55.png

Bildschirmfoto 2026-02-10 um 14.13.43.png

Video

Video