Skip to content

Anhang: Node.js Kernwissen

🎯 Lernziele

In diesem Anhang finden Sie:

  • ✅ Core-Module Schnellreferenz
  • ✅ Häufige npm-Befehle
  • ✅ Express Kernfunktionalität & Middleware
  • ✅ Häufig verwendete Code-Vorlagen
  • ✅ Häufige Fehler-Referenztabelle
  • ✅ Empfohlene Drittanbieter-Pakete (nach Szenarien)

1. Core-Module Schnellreferenz ( nach Verwendungshäufigkeit)

📁 fs (Dateisystem-Modul)

javascript
const fs = require('fs');

// Asynchron (Empfohlen!)
fs.readFile('datei.txt', 'utf8', (err, daten) => { ... });
fs.writeFile('datei.txt', 'Inhalt', 'utf8', (err) => { ... });
fs.appendFile('datei.txt', 'Zeile', 'utf8', (err) => { ... });
fs.unlink('datei.txt', (err) => { ... });  // Löschen
fs.mkdir('ordner', { recursive: true }, (err) => { ... });
fs.rm('ordner', { recursive: true }, (err) => { ... });

// Synchron (Nicht empfohlen!)
const daten = fs.readFileSync('datei.txt', 'utf8');
fs.writeFileSync('datei.txt', 'Inhalt', 'utf8');

// Promise-API (Modern!)
const fsPromises = fs.promises;
await fsPromises.readFile('datei.txt', 'utf8');

// Datei-Informationen
const stat = fs.statSync('datei.txt');
console.log(stat.size);  // Dateigröße
console.log(stat.isFile());  // Ist Datei?
console.log(stat.isDirectory());  // Ist Ordner?

🗺️ path (Pfad-Modul)

javascript
const path = require('path');

// Pfade verbinden (Plattformübergreifend!)
const vollständigerPfad = path.join(__dirname, 'daten', 'datei.txt');

// Pfad auflösen
console.log(path.resolve('daten/datei.txt'));  // → Absoluter Pfad

// Dateinamen extrahieren
console.log(path.basename('/pfad/zu/datei.txt'));  // 'datei.txt'
console.log(path.extname('/pfad/zu/datei.txt'));   // '.txt'
console.log(path.dirname('/pfad/zu/datei.txt'));   // '/pfad/zu'

// Pfad normalisieren (.. und . auflösen)
console.log(path.normalize('/pfad/../datei.txt'));  // '/datei.txt'

// Plattform-Separator
console.log(path.sep);  // Windows: \  |  macOS/Linux: /

🌐 http (HTTP-Server-Modul)

javascript
const http = require('http');

// Einfachen Server erstellen
const server = http.createServer((req, res) => {
  // Request-Informationen
  console.log(req.url);      // URL
  console.log(req.method);   // GET, POST, etc.
  console.log(req.headers);  // HTTP-Header
  
  // Response konfigurieren
  res.writeHead(200, { 'Content-Type': 'application/json' });
  res.setHeader('X-Powered-By', 'Node.js');
  
  // Antwort senden
  res.write('Hallo ');
  res.end('Welt!');  // Muss aufgerufen werden!
});

// Server starten
server.listen(3000, () => {
  console.log('Server läuft auf Port 3000');
});

// POST-Daten lesen
let body = '';
req.on('data', chunk => { body += chunk; });
req.on('end', () => {
  console.log(JSON.parse(body));
});

🔗 url (URL-Analyse-Modul)

javascript
const url = require('url');

// Legacy-API (Vereinfacht)
const parsedUrl = url.parse('https://example.com:8080/pfad?name=Max#abschnitt', true);
console.log(parsedUrl.protocol);  // 'https:'
console.log(parsedUrl.host);      // 'example.com:8080'
console.log(parsedUrl.pathname);  // '/pfad'
console.log(parsedUrl.query);     // { name: 'Max' }

// Moderne API (Empfohlen!)
const neueUrl = new URL('https://example.com/pfad?name=Max');
console.log(neueUrl.searchParams.get('name'));  // 'Max'
console.log(neueUrl.hostname);                   // 'example.com'
console.log(neueUrl.port);                         // '' (Leer)

⚙️ os (Betriebssystem-Modul)

javascript
const os = require('os');

console.log(os.platform());    // 'win32', 'darwin', 'linux'
console.log(os.arch());        // 'x64', 'arm64'
console.log(os.cpus().length);  // Anzahl CPU-Kerne
console.log(os.freemem());    // Freier Arbeitsspeicher (Bytes)
console.log(os.homedir());    // Home-Verzeichnis
console.log(os.hostname());    // Computername

📤 util (Hilfs-Modul)

javascript
const util = require('util');

// Callback in Promise umwandeln
const fs = require('fs');
const readFileAsync = util.promisify(fs.readFile);
const daten = await readFileAsync('datei.txt', 'utf8');

// Objekt inspizieren (wie console.log, aber detaillierter)
console.log(util.inspect({ a: 1, b: { c: 2 } }, { depth: null }));

//Typprüfung
console.log(util.types.isDate(new Date()));  // true
console.log(util.types.isPromise(Promise.resolve())));  // true

2. Häufige npm-Befehle (Schnellreferenz)

📦 Projekt-Initialisierung

bash
# Interaktive Initialisierung
npm init

# Schnelle Initialisierung (Standardwerte)
npm init -y

# Mit spezifischen Werten
npm init -y --name "mein-projekt" --description "Beschreibung"

📥 Pakete installieren

bash
# Lokale Installation (Empfohlen!)
npm install express
npm i express          # Kurzform

# Genaue Version angeben
npm install express@4.18.2

# Neueste Version angeben
npm install express@latest

# Entwicklungsabhängigkeit
npm install --save-dev jest
npm i -D jest         # Kurzform

# Globale Installation (Für CLI-Tools)
npm install -g nodemon
npm i -g nodemon     # Kurzform

# Aus package.json installieren
npm install              # Alias: npm i

📤 Pakete deinstallieren

bash
# Lokales Paket deinstallieren
npm uninstall express
npm un express       # Kurzform

# Globale Installation deinstallieren
npm uninstall -g nodemon

# Entwicklungsabhängigkeit deinstallieren
npm uninstall --save-dev jest

🔄 Pakete aktualisieren

bash
# Alle Pakete aktualisieren
npm update
npm up              # Kurzform

# Einzelnes Paket aktualisieren
npm update express

# Überprüfen auf veraltete Pakete
npm outdated

# Neueste Versionen erzwingen (Vorsicht!)
npm install express@latest

🏃 Skripte ausführen

bash
# Skript aus package.json ausführen
npm run start
npm run dev
npm run build

# Kurzform für häufige Befehle
npm start           # Äquivalent zu: npm run start
npm test            # Äquivalent zu: npm run test
npm stop            # Äquivalent zu: npm run stop

🔍 Andere nützliche Befehle

bash
# Installationsfehler beheben (Bereinigung)
npm cache clean --force

# Abhängigkeiten auflisten
npm list             # Lokal
npm list -g          # Global

# Paket-Informationen anzeigen
npm view express

# Paket installieren, ohne es in package.json zu speichern
npm install --no-save express

# Audierung auf Sicherheitslücken
npm audit
npm audit fix        # Automatische Reparatur

3. Express Kernfunktionalität & Middleware

🚀 Server erstellen & starten

javascript
const express = require('express');
const app = express();
const port = 3000;

// Routen definieren
app.get('/', (req, res) => {
  res.send('Hallo von Express-Server!');
});

// Server starten
app.listen(port, () => {
  console.log(`🚀 Express-Server läuft auf http://localhost:${port}`);
});

🗺️ Routing-Konfiguration

javascript
// HTTP-Methoden
app.get('/users', (req, res) => { ... });          // GET
app.post('/users', (req, res) => { ... });        // POST
app.put('/users/:id', (req, res) => { ... });     // PUT
app.delete('/users/:id', (req, res) => { ... });  // DELETE
app.all('/test', (req, res) => { ... });        // Alle Methoden

// Pfadparameter
app.get('/users/:id', (req, res) => {
  const userId = req.params.id;  // URL-Parameter abrufen
  res.json({ id: userId });
});

// Abfrageparameter (Query String)
app.get('/search', (req, res) => {
  const suchbegriff = req.query.q;  // /search?q=test
  res.json({ suchbegriff });
});

🧩 Middleware-Konzept

javascript
// Eigene Middleware erstellen
function loggingMiddleware(req, res, next) {
  console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`);
  next();  // WICHTIG: next() aufrufen!
}

// Middleware global anwenden (Für ALLE Routen)
app.use(loggingMiddleware);

// Vordefinierte Middleware
app.use(express.json());                // JSON-Body parsen
app.use(express.urlencoded({ extended: true }));  // URL-encoded Body parsen
app.use(express.static('public'));      // Statische Dateien servieren
app.use((req, res, next) => {           // CORS aktivieren
  res.setHeader('Access-Control-Allow-Origin', '*');
  next();
});

// Middleware nur für spezifische Route
app.use('/api', authMiddleware);

📁 Statische Ressourcen bereitstellen

javascript
const path = require('path');
const express = require('express');
const app = express();

// Statische Dateien aus "public"-Ordner servieren
app.use(express.static(path.join(__dirname, 'public')));

// Beispiel:
// public/
//   ├── index.html
//   ├── style.css
//   └── script.js

// Aufruf:
// http://localhost:3000/ → public/index.html
// http://localhost:3000/style.css → public/style.css

// Mehrere statische Ordner
app.use(express.static('public'));
app.use('/bilder', express.static('bilder')); 
// → http://localhost:3000/bilder/logo.png

4. Häufig verwendete Code-Vorlagen

📂 Vorlage 1: Einfachen HTTP-Server (Nativ)

javascript
const http = require('http');

const server = http.createServer((req, res) => {
  // CORS-Header setzen
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
  
  // OPTIONS-Anfrage beantworten (Pre-flight)
  if (req.method === 'OPTIONS') {
    res.writeHead(204);
    res.end();
    return;
  }
  
  // Routing
  if (req.url === '/' && req.method === 'GET') {
    res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
    res.end('<h1>Willkommen!</h1>');
  } else if (req.url === '/api/data' && req.method === 'GET') {
    res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
    res.end(JSON.stringify({ message: 'Hallo!' }));
  } else {
    res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });
    res.end('404 - Seite nicht gefunden');
  }
});

server.listen(3000, () => {
  console.log('🚀 Server läuft auf http://localhost:3000');
});

🌐 Vorlage 2: Einfache API mit Express

javascript
const express = require('express');
const app = express();
const port = 3000;

// Middleware
app.use(express.json());  // JSON-Body parsen
app.use((req, res, next) => {  // Logging
  console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`);
  next();
});

// "Datenbank" (Array)
let users = [
  { id: 1, name: 'Max', email: 'max@example.com' },
  { id: 2, name: 'Anna', email: 'anna@example.com' }
];

// ROUTEN

// 1. Alle User abrufen (GET)
app.get('/api/users', (req, res) => {
  res.json({ success: true, data: users });
});

// 2. Einzelnen User abrufen (GET)
app.get('/api/users/:id', (req, res) => {
  const id = parseInt(req.params.id);
  const user = users.find(u => u.id === id);
  
  if (!user) {
    return res.status(404).json({ success: false, error: 'User nicht gefunden' });
  }
  
  res.json({ success: true, data: user });
});

// 3. User erstellen (POST)
app.post('/api/users', (req, res) => {
  const { name, email } = req.body;
  
  if (!name || !email) {
    return res.status(400).json({ success: false, error: 'Name und Email erforderlich' });
  }
  
  const newUser = {
    id: users.length + 1,
    name,
    email
  };
  
  users.push(newUser);
  
  res.status(201).json({ success: true, data: newUser });
});

// 4. User aktualisieren (PUT)
app.put('/api/users/:id', (req, res) => {
  const id = parseInt(req.params.id);
  const { name, email } = req.body;
  
  const userIndex = users.findIndex(u => u.id === id);
  
  if (userIndex === -1) {
    return res.status(404).json({ success: false, error: 'User nicht gefunden' });
  }
  
  users[userIndex] = { id, name, email };
  
  res.json({ success: true, data: users[userIndex] });
});

// 5. User löschen (DELETE)
app.delete('/api/users/:id', (req, res) => {
  const id = parseInt(req.params.id);
  const userIndex = users.findIndex(u => u.id === id);
  
  if (userIndex === -1) {
    return res.status(404).json({ success: false, error: 'User nicht gefunden' });
  }
  
  const [deletedUser] = users.splice(userIndex, 1);
  
  res.json({ success: true, message: 'User gelöscht', data: deletedUser });
});

// Server starten
app.listen(port, () => {
  console.log(`🚀 API-Server läuft auf http://localhost:${port}`);
  console.log('\nVerfügbare Endpunkte:');
  console.log('  GET    /api/users');
  console.log('  GET    /api/users/:id');
  console.log('  POST   /api/users');
  console.log('  PUT    /api/users/:id');
  console.log('  DELETE /api/users/:id');
});

📁 Vorlage 3: Datei-Upload mit Multer

javascript
const express = require('express');
const multer = require('multer');
const path = require('path');
const app = express();
const port = 3000;

// Speicherkonfiguration
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, 'uploads/');  // Upload-Ordner
  },
  filename: (req, file, cb) => {
    const uniqueName = Date.now() + path.extname(file.originalname);
    cb(null, uniqueName);
  }
});

const upload = multer({ storage: storage });

// Einzelne Datei uploaden
app.post('/upload', upload.single('datei'), (req, res) => {
  res.json({
    success: true,
    message: 'Datei erfolgreich hochgeladen!',
    filename: req.file.filename,
    pfad: `/uploads/${req.file.filename}`
  });
});

// Mehrere Dateien uploaden
app.post('/upload-multiple', upload.array('dateien', 5), (req, res) => {
  res.json({
    success: true,
    message: `${req.files.length} Dateien hochgeladen!`,
    dateien: req.files.map(f => f.filename)
  });
});

app.listen(port, () => {
  console.log(`🚀 Upload-Server läuft auf http://localhost:${port}`);
});

/* Installation: npm install multer */

5. Häufige Fehler-Referenztabelle

FehlerUrsacheLösung
Cannot find moduleModul nicht installiert oder falscher Pfadnpm install <paket> ausführen, Pfad mit path.join(__dirname, '...') korrigieren
await is only valid in async functionawait außerhalb einer async-Funktion verwendetFunktion mit async markieren: async function meinFunktion()
CORS policy errorCross-Origin-Anfrage blockiertCORS-Header setzen oder cors-Paket verwenden: npm install cors
Port already in usePort wird bereits von anderem Prozess verwendetAnderen Port verwenden oder Prozess beenden: npx kill-port 3000
Cannot read property of undefinedAsynchroner Code nicht richtig behandeltawait verwenden oder .then()-Kette verwenden
PayloadTooLargeErrorZugroße JSON-Payloadexpress.json({ limit: '10mb' }) konfigurieren
EPERM: operation not permittedDatei-Zugriffsberechtigung fehltAls Administrator ausführen (Windows) oder Berechtigungen mit chmod ändern (macOS/Linux)
MODULE_NOT_FOUNDGroß-/Kleinschreibung bei Dateinamen (besonders auf Linux/macOS)Dateinamen in require() auf korrekte Groß-/Kleinschreibung überprüfen

6. Empfohlene Drittanbieter-Pakete (nach Szenarien)

🌐 Web-Frameworks

PaketBeschreibungInstallation
expressMinimalistisches Web-Frameworknpm i express
koaModernes Framework (von Express-Team)npm i koa
nestjsProgressives Framework (TypeScript)npm i @nestjs/core

🗄️ Datenbanken

PaketBeschreibungInstallation
mysql2MySQL-Client für Node.jsnpm i mysql2
mongodbMongoDB-Client für Node.jsnpm i mongodb
mongooseMongoDB ODM (besser für Mongoose)npm i mongoose
sequelizeORM für MySQL, PostreSQL, etc.npm i sequelize

🔐 Authentifizierung & Sicherheit

PaketBeschreibungInstallation
bcryptPasswörter hashennpm i bcrypt
jsonwebtokenJWT (JSON Web Tokens)npm i jsonwebtoken
passportAuthentifizierungs-Middlewarenpm i passport
corsCORS aktivierennpm i cors
helmetSicherheits-Header setzennpm i helmet

📁 Datei-Upload & Verarbeitung

PaketBeschreibungInstallation
multerDatei-Uploads verarbeitennpm i multer
sharpBilder verarbeiten (Zuschneiden, Größe ändern)npm i sharp

⚡ Asynchrone Utilities

PaketBeschreibungInstallation
axiosHTTP-Client für Browser und Node.jsnpm i axios
node-fetchfetch API für Node.jsnpm i node-fetch
bluebirdLeistungsstarke Promisesnpm i bluebird

🛠️ Entwicklung & Debugging

PaketBeschreibungInstallation
nodemonServer bei Änderungen automatisch neustartennpm i -D nodemon
dotenvUmgebungsvariablen aus .env ladennpm i dotenv
debugDebugging-Utilitynpm i debug
jestTesting Frameworknpm i -D jest

📝 Datenvalidierung & Verarbeitung

PaketBeschreibungInstallation
joiDatenvalidierungnpm i joi
yupSchema-Validierungnpm i yup
validatorString-Validierungnpm i validator

⏰ Zeit & Datum

PaketBeschreibungInstallation
momentDatum/Zeit-Verarbeitung (Veraltet, aber beliebt)npm i moment
dayjsLeichtgewichtige Alternative zu Moment.jsnpm i dayjs
date-fnsModerne Datum/Zeit-Utilitysnpm i date-fns

🛠️ CLI-Tools

PaketBeschreibungInstallation
commanderCLI-Tools erstellennpm i commander
inquirerInteraktive CLI-Promptsnpm i inquirer
chalkTerminal-Ausgaben farbig gestaltennpm i chalk

📚 Weiterführende Ressourcen


🎉 Herzlichen Glückwunsch! Sie haben den kompletten Node.js-Anfängerkurs erfolgreich abgeschlossen! 🎉

🚀 Viel Erfolg bei Ihrer weiteren Node.js-Reise! 🚀

Frei für alle Anfänger