Join Backend
Inhaltsverzeichnis
Entwicklung eines Task-Management-Backends mit ExpressJS
Dieser Beitrag wurde von ChatGPT erstellt.
Einleitung
In diesem Beitrag erläutern wir die Entwicklung eines Task-Management-Backends mit ExpressJS und einer SQL-Datenbank. Während der Entwicklung nutzen wir SQLite, später wird die Umstellung auf MySQL erfolgen. Das Backend stellt eine Registrierungs- und Login-API bereit, verwendet JWT zur Authentifizierung und bietet die Möglichkeit zur Verwaltung von Tasks und Kontakten.
Projektstruktur
Die Projektstruktur ist wie folgt organisiert:
backend/
│-- node_modules/
│-- src/
│ │-- config/ # Konfigurationsdateien
│ │-- controllers/ # API-Logik
│ │-- middleware/ # Auth-Middleware
│ │-- models/ # Datenbankmodelle
│ │-- routes/ # API-Routen
│ │-- services/ # Geschäftslogik
│ │-- utils/ # Hilfsfunktionen
│ │-- app.js # Express-App
│ │-- server.js # Server-Startpunkt
│-- .env # Umgebungsvariablen
│-- package.json # Paketverwaltung
│-- README.md # Dokumentation
Technologien
- ExpressJS: Framework für das Backend
- SQLite / MySQL: Datenbank für Entwicklung und Produktion
- Sequelize: ORM für SQL-Datenbanken
- bcrypt: Hashing von Passwörtern
- jsonwebtoken (JWT): Authentifizierung
- dotenv: Verwaltung von Umgebungsvariablen
- axios: HTTP-Anfragen im Frontend
Implementierte Module
1. Authentifizierung
Die Authentifizierung erfolgt über JWT-Tokens. Folgende Endpunkte stehen zur Verfügung:
- POST /auth/register – Registrierung neuer Benutzer
- POST /auth/login – Benutzeranmeldung
- GET /auth/me – Abruf eigener Profildaten
Middleware zur Authentifizierung:
const jwt = require('jsonwebtoken');
module.exports = (req, res, next) => {
const token = req.header('Authorization');
if (!token) {
return res.status(401).json({ message: 'Kein Token, Zugriff verweigert' });
}
try {
const decoded = jwt.verify(token.split(' ')[1], process.env.JWT_SECRET);
req.user = decoded;
next();
} catch (err) {
res.status(401).json({ message: 'Token ungültig' });
}
};
2. Task-Verwaltung
Jeder Task verfügt über folgende Eigenschaften:
- Titel
- Beschreibung
- Fälligkeitsdatum
- Kategorie
- Sachbearbeiter
- Priorität
- Subtasks
- Status (geplant, bearbeitung, prüfen, fertig)
Routen:
- POST /tasks – Task anlegen
- GET /tasks – Aufgaben abrufen
- PUT /tasks/:id – Task bearbeiten
- DELETE /tasks/:id – Task löschen
3. Dashboard
Das Dashboard liefert statistische Daten über Tasks:
- Anzahl aller Tasks
- Anzahl Tasks mit hoher Priorität
- Nächstes Fälligkeitsdatum
Route:
router.get('/', authMiddleware, DashboardController.getDashboardStats);
Fehler und deren Behebung
Fehler 1: “Cannot find module ‘./routes/userRoutes’”
Ursache:
- Die Datei userRoutes.js war nicht im erwarteten Pfad vorhanden.
Lösung:
- Überprüfung der Projektstruktur und Sicherstellung, dass die Datei korrekt benannt und importiert wurde.
Fehler 2: “401 Unauthorized” bei API-Anfragen
Ursache:
- Der JWT-Token wurde nicht korrekt übermittelt.
Lösung:
- Sicherstellen, dass der Token mit dem Präfix Bearer in den Header eingefügt wird:
axios.post('/api/tasks', data, {
headers: { Authorization: `Bearer ${authStore.token}` }
});
Fehler 3: “Cannot read properties of null (reading ‘parentNode’)”
*Ursache:
- Zugriff auf ein nicht vorhandenes DOM-Element.
Lösung:
- Überprüfung, ob das Element existiert, bevor darauf zugegriffen wird:
if (element?.parentNode) {
element.parentNode.insertBefore(newElement, element);
}
Fehler 4: “404 Not Found” für das Dashboard
Ursache:
- API-Routen für das Dashboard waren nicht registriert.
Lösung:
- Einbindung der Dashboard-Routen in server.js:
const dashboardRoutes = require('./routes/dashboardRoutes');
app.use('/api/dashboard', dashboardRoutes);
Fazit
Durch den modularen Aufbau des Backends mit ExpressJS und einer klaren Trennung der Funktionalitäten konnte eine robuste Lösung geschaffen werden. Fehler wurden systematisch behoben, indem Debugging-Techniken und strukturiertes Testen zum Einsatz kamen.
Mit diesen Ansätzen ist das Task-Management-Backend gut skalierbar und bereit für den Einsatz in einer Produktionsumgebung.