====== LU16b – UPDATE (PUT) & DELETE (DELETE) mit Express und Postman ====== ===== Lernziele ===== * Sie können einen bestehenden Post über ''PUT /api/posts/:id'' aktualisieren (Update). * Sie können einen bestehenden Post über ''DELETE /api/posts/:id'' löschen (Delete). * Sie wissen, wie Sie ''req.params.id'' (Route-Parameter) und ''req.body'' (Body-Daten) verwenden. * Sie verwenden passende **HTTP-Statuscodes** (200, 400, 404). * Sie können die Endpoints mit **Postman** testen. ===== Voraussetzungen ===== Damit ''PUT'' und ''DELETE'' funktionieren, muss in Ihrem ''index.js'' weiterhin Folgendes vorhanden sein: * ''app.use(express.json());'' (damit JSON aus dem Request-Body in ''req.body'' landet) * das Array ''posts'' mit Beispiel-Daten * die bereits erstellten Routes ''GET /api/posts'', ''GET /api/posts/:id'' und ''POST /api/posts'' Fügen Sie die folgenden Routen **unterhalb** Ihrer bisherigen Routen in ''index.js'' ein (die Reihenfolge ist nicht entscheidend, aber Übersicht hilft). ===== UPDATE – Post aktualisieren (PUT /api/posts/:id) ===== ==== Was bedeutet UPDATE mit PUT? ==== Mit ''PUT'' aktualisieren Sie einen bestehenden Datensatz. Der Client schickt dazu einen Request an: * ''/api/posts/:id'' → ''id'' ist die ''post_id'' des Posts, der geändert werden soll. * Die neuen Werte werden als JSON im Request-Body mitgeschickt. ==== Code: PUT-Route ==== // UPDATE – vorhandenen Post aktualisieren app.put('/api/posts/:id', (req, res) => { const id = Number(req.params.id); // Post suchen nach der ID aus dem Request im posts-Array (Liste) const post = posts.find(p => p.post_id === id); if (!post) { return res.status(404).send('Post nicht gefunden'); } // Neue Werte aus dem Body lesen const userId = req.body.user_id; const title = req.body.title; const imageUrl = req.body.image_url; const description = req.body.description; const likes = req.body.likes; // Validierung: mindestens ein Feld muss vorhanden sein if ( userId === undefined && title === undefined && imageUrl === undefined && description === undefined && likes === undefined ) { return res.status(400).send('Bitte mindestens ein Feld zum Aktualisieren mitsenden.'); } // Update nur für Felder, die wirklich geschickt wurden if (userId !== undefined) { post.user_id = userId; } if (title !== undefined) { post.title = title; } if (imageUrl !== undefined) { post.image_url = imageUrl; } if (description !== undefined) { post.description = description; } if (likes !== undefined) { post.likes = likes; } // Antwort: 200 OK + aktualisiertes Objekt res.status(200).json(post); }); ==== Test mit Postman (PUT) ==== {{:modul:m290_guko:learningunits:lu16:theorie:screenshot_2025-12-18_at_13.34.19.png?direct&900| Screenshot: einen Post abändern.}} - Methode: ''PUT'' - URL: ''http://localhost:3000/api/posts/2'' - Tab ''Body'' → ''raw'' → ''JSON'' - Beispiel-Body: { "title": "Sunset Vibes (updated)", "likes": 99 } Erwartung: * Status ''200 OK'' * JSON-Objekt des aktualisierten Posts (''post_id: 2'') mit neuem ''title'' und ''likes'' * Danach ''GET /api/posts/2'' testen → Änderungen sollten sichtbar sein ===== DELETE – Post löschen (DELETE /api/posts/:id) ===== ==== Was bedeutet DELETE? ==== Mit ''DELETE'' entfernen Sie einen Datensatz. Der Client schickt dazu einen Request an: * ''DELETE /api/posts/:id'' Der Server sucht den passenden Post und entfernt ihn aus der Liste. ==== Code: DELETE-Route ==== // DELETE – Post löschen app.delete('/api/posts/:id', (req, res) => { const id = Number(req.params.id); // Index suchen (praktisch fürs Löschen) const index = posts.findIndex(p => p.post_id === id); if (index === -1) { return res.status(404).send('Post nicht gefunden'); } // Löschen: splice gibt ein Array zurück -> [0] ist das gelöschte Objekt const deletedPost = posts.splice(index, 1)[0]; // Antwort: 200 OK + gelöschter Post (zur Kontrolle) res.status(200).json(deletedPost); }); ==== Test mit Postman (DELETE) ==== {{:modul:m290_guko:learningunits:lu16:theorie:screenshot_2025-12-18_at_13.40.40.png?direct&900| Screenshot: einen Post aus der Liste löschen.}} - Methode: ''DELETE'' - URL: ''http://localhost:3000/api/posts/1'' Erwartung: * Status ''200 OK'' * JSON-Objekt des gelöschten Posts Danach: * ''GET /api/posts'' → der gelöschte Post sollte nicht mehr in der Liste sein * ''GET /api/posts/1'' → sollte ''404 Not Found'' liefern ===== Typische Fehlerquellen ===== * ''req.params.id'' ist immer ein String → mit ''Number(...)'' oder ''parseInt(...)'' umwandeln. * Bei ''PUT'' vergessen viele, den Request-Body als JSON zu senden → in Postman unbedingt ''raw'' + ''JSON'' wählen. * Bei ''PUT'' und ''DELETE'' immer prüfen: existiert das Objekt? → sonst ''404'' zurückgeben. * Bei ''PUT'': wenn keine Felder im Body sind → ''400'' zurückgeben (sonst „Update ohne Update“). ===== Ausblick ===== Sie können jetzt CRUD auf API-Ebene komplett: * Create → ''POST /api/posts'' * Read → ''GET /api/posts'' und ''GET /api/posts/:id'' * Update → ''PUT /api/posts/:id'' * Delete → ''DELETE /api/posts/:id'' In der nächsten Unterrichtseinheit ersetzen wir die lokale Liste ''posts'' durch eine echte MySQL-Tabelle und führen dieselben Operationen über SQL aus.