Die Grenze zum Server definieren
Ein Backend bietet der Oberfläche einen verlässlichen Ort, um Aufgaben auszuführen. Mit Node.js und Express lernst du, wie eine Route eine Anfrage empfängt, Anwendungslogik ausführt und eine nützliche Antwort liefert. Eine klare Grenze trennt Darstellung von Regeln und Datenverarbeitung.
Daten dauerhaft verfügbar machen
MongoDB führt dokumentorientierte Datenspeicherung ein. Entscheidend ist, welche Informationen zusammengehören, wie Datensätze mit der Anwendung verbunden sind und wie der Server sie liest oder aktualisiert. Eine durchdachte Datenschicht macht die Anwendung über eine einzelne Browsersitzung hinaus nützlich.
Identität mit geschützten Aktionen verbinden
Authentifizierung gehört zum Anwendungsablauf und ist mehr als eine Anmeldeseite. JWT und Google OAuth übernehmen unterschiedliche Aufgaben: Das eine steht für eine authentifizierte Sitzung, das andere ermöglicht die Identitätsfeststellung über Google. Diese Stufe verbindet Routen, Daten und Identität zu einer dynamischen Anwendung.
Vom Konzept zu funktionierendem Code
Diese Ausschnitte zeigen, wie die Inhalte jeder Stufe in echten Projekten aussehen. Sie sind Ausgangspunkte zum Lesen, Hinterfragen, Anpassen und Testen — kein Code zum blinden Kopieren.
An der Servergrenze validieren
Die Route liest die Workshop-ID aus der URL und prüft Eingaben vor dem Schreiben. Ungültige Eingaben, ein fehlender Workshop und eine erfolgreiche Erstellung erhalten unterschiedliche HTTP-Statuscodes.
router.post("/workshops/:id/registrations", async (req, res) => {
const { name, email } = req.body;
const workshopId = req.params.id;
if (!name?.trim() || !/^\S+@\S+\.\S+$/.test(email ?? "")) {
return res.status(400).json({ error: "Name and valid email required." });
}
const workshop = await workshops.findOne({ _id: workshopId });
if (!workshop) return res.status(404).json({ error: "Workshop not found." });
const registration = await registrations.insertOne({
workshopId,
name: name.trim(),
email: email.toLowerCase(),
createdAt: new Date(),
});
return res.status(201).json({ id: registration.insertedId });
});Datenzugriff in einem Repository bündeln
Das Repository verwaltet MongoDB-Operationen und bietet dem Rest der Anwendung eine kleine Schnittstelle. So bleibt die Route verständlich und Speicherung lässt sich zentral ändern oder testen.
export function createRegistrationRepository(db) {
const registrations = db.collection("registrations");
return {
async create(input) {
const result = await registrations.insertOne({
workshopId: input.workshopId,
name: input.name.trim(),
email: input.email.toLowerCase(),
status: "pending",
createdAt: new Date(),
});
return { id: result.insertedId.toString(), status: "pending" };
},
findForWorkshop(workshopId) {
return registrations.find({ workshopId }).toArray();
},
};
}Lesen und selbst anpassenÄndere eine Anforderung, überlege dir das Ergebnis und überprüfe deine Annahme durch Ausführen. Erkläre im Review deine Entscheidung und eine mögliche nächste Verbesserung.