Appearance
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()))); // true2. 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 Reparatur3. 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.png4. 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
| Fehler | Ursache | Lösung |
|---|---|---|
Cannot find module | Modul nicht installiert oder falscher Pfad | npm install <paket> ausführen, Pfad mit path.join(__dirname, '...') korrigieren |
await is only valid in async function | await außerhalb einer async-Funktion verwendet | Funktion mit async markieren: async function meinFunktion() |
CORS policy error | Cross-Origin-Anfrage blockiert | CORS-Header setzen oder cors-Paket verwenden: npm install cors |
Port already in use | Port wird bereits von anderem Prozess verwendet | Anderen Port verwenden oder Prozess beenden: npx kill-port 3000 |
Cannot read property of undefined | Asynchroner Code nicht richtig behandelt | await verwenden oder .then()-Kette verwenden |
PayloadTooLargeError | Zugroße JSON-Payload | express.json({ limit: '10mb' }) konfigurieren |
EPERM: operation not permitted | Datei-Zugriffsberechtigung fehlt | Als Administrator ausführen (Windows) oder Berechtigungen mit chmod ändern (macOS/Linux) |
MODULE_NOT_FOUND | Groß-/Kleinschreibung bei Dateinamen (besonders auf Linux/macOS) | Dateinamen in require() auf korrekte Groß-/Kleinschreibung überprüfen |
6. Empfohlene Drittanbieter-Pakete (nach Szenarien)
🌐 Web-Frameworks
| Paket | Beschreibung | Installation |
|---|---|---|
| express | Minimalistisches Web-Framework | npm i express |
| koa | Modernes Framework (von Express-Team) | npm i koa |
| nestjs | Progressives Framework (TypeScript) | npm i @nestjs/core |
🗄️ Datenbanken
| Paket | Beschreibung | Installation |
|---|---|---|
| mysql2 | MySQL-Client für Node.js | npm i mysql2 |
| mongodb | MongoDB-Client für Node.js | npm i mongodb |
| mongoose | MongoDB ODM (besser für Mongoose) | npm i mongoose |
| sequelize | ORM für MySQL, PostreSQL, etc. | npm i sequelize |
🔐 Authentifizierung & Sicherheit
| Paket | Beschreibung | Installation |
|---|---|---|
| bcrypt | Passwörter hashen | npm i bcrypt |
| jsonwebtoken | JWT (JSON Web Tokens) | npm i jsonwebtoken |
| passport | Authentifizierungs-Middleware | npm i passport |
| cors | CORS aktivieren | npm i cors |
| helmet | Sicherheits-Header setzen | npm i helmet |
📁 Datei-Upload & Verarbeitung
| Paket | Beschreibung | Installation |
|---|---|---|
| multer | Datei-Uploads verarbeiten | npm i multer |
| sharp | Bilder verarbeiten (Zuschneiden, Größe ändern) | npm i sharp |
⚡ Asynchrone Utilities
| Paket | Beschreibung | Installation |
|---|---|---|
| axios | HTTP-Client für Browser und Node.js | npm i axios |
| node-fetch | fetch API für Node.js | npm i node-fetch |
| bluebird | Leistungsstarke Promises | npm i bluebird |
🛠️ Entwicklung & Debugging
| Paket | Beschreibung | Installation |
|---|---|---|
| nodemon | Server bei Änderungen automatisch neustarten | npm i -D nodemon |
| dotenv | Umgebungsvariablen aus .env laden | npm i dotenv |
| debug | Debugging-Utility | npm i debug |
| jest | Testing Framework | npm i -D jest |
📝 Datenvalidierung & Verarbeitung
| Paket | Beschreibung | Installation |
|---|---|---|
| joi | Datenvalidierung | npm i joi |
| yup | Schema-Validierung | npm i yup |
| validator | String-Validierung | npm i validator |
⏰ Zeit & Datum
| Paket | Beschreibung | Installation |
|---|---|---|
| moment | Datum/Zeit-Verarbeitung (Veraltet, aber beliebt) | npm i moment |
| dayjs | Leichtgewichtige Alternative zu Moment.js | npm i dayjs |
| date-fns | Moderne Datum/Zeit-Utilitys | npm i date-fns |
🛠️ CLI-Tools
| Paket | Beschreibung | Installation |
|---|---|---|
| commander | CLI-Tools erstellen | npm i commander |
| inquirer | Interaktive CLI-Prompts | npm i inquirer |
| chalk | Terminal-Ausgaben farbig gestalten | npm i chalk |
📚 Weiterführende Ressourcen
- Node.js Offizielle Dokumentation
- Express Offizielle Dokumentation
- MDN: Asynchrone JavaScript
- freeCodeCamp: Node.js
🎉 Herzlichen Glückwunsch! Sie haben den kompletten Node.js-Anfängerkurs erfolgreich abgeschlossen! 🎉
🚀 Viel Erfolg bei Ihrer weiteren Node.js-Reise! 🚀
