Modul 295 - Backend Entwicklung mit Node.js¶
1. Einführung in Node.js¶
Node.js ist eine Laufzeitumgebung für JavaScript, die auf der V8-JavaScript-Engine von Chrome basiert. Sie ermöglicht es, JavaScript auf dem Server (Backend) auszuführen, anstatt nur im Browser (Frontend).
Wichtige Eigenschaften¶
- Event-Driven: Node.js reagiert auf Ereignisse (Events).
- Non-Blocking I/O: Eingabe-/Ausgabe-Operationen blockieren nicht den Hauptthread (dazu später mehr).
- Single-Threaded: Es gibt nur einen Hauptausführungsstrang, aber durch asynchrone Prozesse ist es sehr effizient.
2. Das Dateisystem (fs Modul)¶
Um auf Dateien zuzugreifen (Lesen, Schreiben), verwenden wir das eingebaute Modul fs (File System).
const fs = require('fs');
// Eine Datei schreiben
fs.writeFileSync('nachricht.txt', 'Hallo Welt!');
// Eine Datei lesen
const inhalt = fs.readFileSync('nachricht.txt', 'utf-8');
console.log(inhalt);
3. Synchron vs. Asynchron¶
Das Verständnis von synchronem vs. asynchronem Code ist entscheidend in Node.js.
Synchron (Blockierend)¶
Der Code wird Zeile für Zeile abgearbeitet. Wenn eine Operation (z.B. Datei lesen) dauert, stoppt das gesamte Programm, bis sie fertig ist.
sequenceDiagram
participant Main as Hauptprogramm
participant FS as Dateisystem
Main->>FS: Lese Datei (Synchron)
activate FS
Note right of Main: Programm WARTET...
FS-->>Main: Datei Inhalt
deactivate FS
Main->>Main: Mache weiter...
Code Beispiel (Synchron):
const fs = require('fs');
console.log('Start');
// Das Programm blockiert hier, bis die Datei komplett gelesen ist
const data = fs.readFileSync('grosse_datei.txt', 'utf-8');
console.log('Datei gelesen:', data);
console.log('Ende');
// Ausgabe:
// Start
// Datei gelesen: ...
// Ende
Asynchron (Nicht-Blockierend)¶
Der Code gibt den Befehl "Lese Datei" und macht sofort mit der nächsten Zeile weiter. Wenn die Datei fertig gelesen ist, wird eine Callback-Funktion aufgerufen.
sequenceDiagram
participant Main as Hauptprogramm
participant FS as Dateisystem
Main->>FS: Lese Datei (Asynchron)
activate FS
Main->>Main: Mache SOFORT weiter...
Note right of Main: Programm läuft weiter
FS-->>Main: Callback: Datei fertig!
deactivate FS
Code Beispiel (Asynchron):
const fs = require('fs');
console.log('Start');
// Der Befehl wird abgesetzt, das Programm läuft sofort weiter
fs.readFile('grosse_datei.txt', 'utf-8', (err, data) => {
if (err) throw err;
console.log('Datei fertig gelesen!');
});
console.log('Ende');
// Ausgabe:
// Start
// Ende
// Datei fertig gelesen!
[!IMPORTANT] In modernen Webservern nutzen wir fast immer asynchronen Code, damit der Server nicht einfriert, während er auf Datenbanken oder Dateien wartet.
4. Webserver Grundlagen¶
Mit dem http Modul können wir einfach einen Webserver erstellen.
const http = require('http');
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hallo von meinem Node.js Server!\n');
});
const port = 3000;
server.listen(port, () => {
console.log(`Server läuft auf http://localhost:${port}/`);
});