Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| modul:m290_guko:learningunits:lu17:theorie:a_intro [2026/01/02 01:17] – gkoch | modul:m290_guko:learningunits:lu17:theorie:a_intro [2026/01/12 07:43] (aktuell) – gkoch | ||
|---|---|---|---|
| Zeile 3: | Zeile 3: | ||
| ===== Lernziele ===== | ===== Lernziele ===== | ||
| * Sie können Ihre **MySQL-Datenbank** aus einem Express-Server heraus ansprechen. | * Sie können Ihre **MySQL-Datenbank** aus einem Express-Server heraus ansprechen. | ||
| - | * Sie können die CRUD-Routen aus LU16 ('' | + | * Sie können die CRUD-Routen aus LU16 ('' |
| * Sie setzen einfache **Validierung** ein (Pflichtfelder prüfen). | * Sie setzen einfache **Validierung** ein (Pflichtfelder prüfen). | ||
| * Sie verwenden passende **HTTP-Statuscodes** (200, 201, 400, 404, 500). | * Sie verwenden passende **HTTP-Statuscodes** (200, 201, 400, 404, 500). | ||
| Zeile 19: | Zeile 19: | ||
| In LU17 ersetzen Sie diese In-Memory-Liste durch eine echte Datenbank: | In LU17 ersetzen Sie diese In-Memory-Liste durch eine echte Datenbank: | ||
| - | * Die Daten kommen aus der **MySQL-Tabelle '' | + | * Die Daten kommen aus der **MySQL-Tabelle '' |
| * Ihr Express-Server ist die **Brücke** zwischen Client (Postman) und Datenbank. | * Ihr Express-Server ist die **Brücke** zwischen Client (Postman) und Datenbank. | ||
| * Die gleiche Idee bleibt: **HTTP-Anfrage → Route → Logik/SQL → HTTP-Antwort**. | * Die gleiche Idee bleibt: **HTTP-Anfrage → Route → Logik/SQL → HTTP-Antwort**. | ||
| Zeile 51: | Zeile 51: | ||
| Das ERD der Datenbank sieht so aus: | Das ERD der Datenbank sieht so aus: | ||
| - | {{ : | + | {{ : |
| Eine mögliche Tabellenstruktur für die Tabelle " | Eine mögliche Tabellenstruktur für die Tabelle " | ||
| Zeile 65: | Zeile 65: | ||
| </ | </ | ||
| + | <WRAP center round important 60%> | ||
| + | Achtung: Die Primär-Spalte heisst neu '' | ||
| + | </ | ||
| ===== Schritt 1: mysql2 installieren ===== | ===== Schritt 1: mysql2 installieren ===== | ||
| Zeile 193: | Zeile 196: | ||
| // SQL-Abfrage: | // SQL-Abfrage: | ||
| const sql = ` | const sql = ` | ||
| - | SELECT | + | SELECT |
| FROM posts | FROM posts | ||
| `; | `; | ||
| Zeile 213: | Zeile 216: | ||
| </ | </ | ||
| - | **Test in Postman** | + | === Test in Postman |
| * Methode: '' | * Methode: '' | ||
| * URL: '' | * URL: '' | ||
| Zeile 236: | Zeile 239: | ||
| const sql = ` | const sql = ` | ||
| - | SELECT | + | SELECT |
| FROM posts | FROM posts | ||
| - | WHERE post_id | + | WHERE id = ? |
| `; | `; | ||
| Zeile 303: | Zeile 306: | ||
| // insertId kommt von MySQL AUTO_INCREMENT | // insertId kommt von MySQL AUTO_INCREMENT | ||
| const newPost = { | const newPost = { | ||
| - | | + | |
| - | user_id, | + | |
| - | title, | + | |
| image_url: image_url || '', | image_url: image_url || '', | ||
| description: | description: | ||
| Zeile 316: | Zeile 319: | ||
| </ | </ | ||
| </ | </ | ||
| + | |||
| + | === Test in Postman === | ||
| **Test-Body (Postman → Body → raw → JSON)** | **Test-Body (Postman → Body → raw → JSON)** | ||
| Zeile 331: | Zeile 336: | ||
| ==== UPDATE: Post ändern (PUT / | ==== UPDATE: Post ändern (PUT / | ||
| - | Hier übernehmen | + | |
| + | In LU16b haben Sie einen Post so aktualisiert: | ||
| + | Genau diese Logik übernehmen wir jetzt – der Unterschied ist nur: statt im Array ändern wir jetzt die MySQL-Tabelle | ||
| <WRAP box round center 80%> | <WRAP box round center 80%> | ||
| <code javascript> | <code javascript> | ||
| // UPDATE – Post vollständig ersetzen (PUT) | // UPDATE – Post vollständig ersetzen (PUT) | ||
| + | // Route: PUT http:// | ||
| app.put('/ | app.put('/ | ||
| + | |||
| const id = Number(req.params.id); | const id = Number(req.params.id); | ||
| + | |||
| if (Number.isNaN(id)) { | if (Number.isNaN(id)) { | ||
| return res.status(400).send(' | return res.status(400).send(' | ||
| } | } | ||
| - | // Alle Felder werden erwartet | + | // Alle Felder werden erwartet |
| const user_id = req.body.user_id; | const user_id = req.body.user_id; | ||
| const title = req.body.title; | const title = req.body.title; | ||
| Zeile 349: | Zeile 360: | ||
| const likes = req.body.likes; | const likes = req.body.likes; | ||
| - | // Validierung: | + | // Validierung: |
| - | if (user_id === undefined || title === undefined || image_url === undefined || description === undefined || likes === undefined) { | + | // likes kann 0 sein -> deshalb auf undefined prüfen |
| + | if ( | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| return res.status(400).send(' | return res.status(400).send(' | ||
| } | } | ||
| - | const sql = UPDATE posts SET user_id = ?, title = ?, image_url = ?, description = ?, likes = ? WHERE post_id | + | const sql = ` |
| + | | ||
| + | | ||
| + | | ||
| + | `; | ||
| const values = [user_id, title, image_url, description, | const values = [user_id, title, image_url, description, | ||
| Zeile 368: | Zeile 390: | ||
| } | } | ||
| - | // Update hat geklappt: Status | + | // 200 OK + das " |
| res.status(200).json({ | res.status(200).json({ | ||
| - | | + | |
| - | user_id, | + | |
| - | title, | + | |
| - | image_url, | + | |
| - | description, | + | |
| - | likes | + | |
| }); | }); | ||
| - | |||
| }); | }); | ||
| }); | }); | ||
| Zeile 383: | Zeile 404: | ||
| </ | </ | ||
| + | === Test in Postman === | ||
| - | ==== DELETE: Post löschen | + | **Test-Body** |
| + | <WRAP box round center 80%> | ||
| + | <code json> | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | </ | ||
| + | </ | ||
| + | Erwartung: | ||
| + | * Status '' | ||
| + | * JSON-Objekt des aktualisierten Posts (inkl. neuem '' | ||
| + | |||
| + | |||
| + | ==== DELETE: Post löschen (DELETE / | ||
| <WRAP box round center 80%> | <WRAP box round center 80%> | ||
| <code javascript> | <code javascript> | ||
| // DELETE – Post löschen | // DELETE – Post löschen | ||
| - | // Route: DELETE http:// | ||
| app.delete('/ | app.delete('/ | ||
| Zeile 398: | Zeile 436: | ||
| } | } | ||
| - | const sql = ' | + | const sql = ' |
| db.query(sql, | db.query(sql, | ||
| - | |||
| if (err) { | if (err) { | ||
| console.error(' | console.error(' | ||
| Zeile 411: | Zeile 448: | ||
| } | } | ||
| - | // Statuscode: 200 + Message | + | // Antwort: 200 + Message |
| - | res.status(200).json({ message: `Post mit post_id=${id} wurde gelöscht.` }); | + | res.status(200).json({ message: `Post mit id=${id} wurde gelöscht.` }); |
| }); | }); | ||
| Zeile 418: | Zeile 455: | ||
| </ | </ | ||
| </ | </ | ||
| + | |||
| + | === Test mit Postman === | ||
| + | |||
| + | * Methode: '' | ||
| + | * URL: '' | ||
| + | |||
| + | Erwartung: | ||
| + | * Status '' | ||
| + | * JSON-Objekt des gelöschten Posts | ||
| + | * Danach '' | ||
| Zeile 431: | Zeile 478: | ||
| ===== Transfer auf Ihr Projekt (LB03) ===== | ===== Transfer auf Ihr Projekt (LB03) ===== | ||
| - | Für Ihr Projekt ersetzen Sie '' | + | Für Ihr Projekt ersetzen Sie '' |
| * Ressourcen-Route: | * Ressourcen-Route: | ||