Zum Inhalt

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}/`);
});