From 8299ad1e24eee503a2a0da2d69d6cfa8730a27ef Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Mon, 22 Jun 2026 22:46:24 +0200 Subject: [PATCH] Fix: NanoBanana null-safe handling + bessere Fehlermeldungen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - _handle_nanobanana_generate: Prüfe code!=0 (z.B. 402=kein Guthaben), data=None-Safe - _handle_nanobanana_status: data=None-Safe + response=None-Safe - JavaScript: Bessere Fehlermeldung wenn resp.json() fehlschlägt - Verhindert 'NoneType' object has no attribute 'get' Crash --- article_server.py | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/article_server.py b/article_server.py index 6900192..42ff928 100644 --- a/article_server.py +++ b/article_server.py @@ -493,7 +493,7 @@ def build_index(articles: list[dict]) -> str:

Artikel-Übersicht

-

{count} Artikel im Archiv · Aktualisieren{token_status}

+

{count} Artikel im Archiv · Aktualisieren · 🎨 Bild-Generator{token_status}

@@ -1038,11 +1038,22 @@ h1{color:#c0392b;}p{color:#888;} return result = _nanobanana_generate(prompt, image_urls, aspect_ratio, resolution) + # Prüfe auf Transport-Fehler (Netzwerk/HTTP) if "error" in result: self._json_reply(500, {"ok": False, "error": result["error"]}) return - - task_id = result.get("data", {}).get("taskId", "") + # Prüfe auf NanoBanana API-Fehler (code != 0, z.B. 402 = kein Guthaben) + api_code = result.get("code", 0) + if api_code != 0: + api_msg = result.get("msg", "Unbekannter API-Fehler") + self._json_reply(500, {"ok": False, "error": f"NanoBanana: {api_msg} (Code {api_code})"}) + return + # Null-Safe: data kann None sein + data = result.get("data") or {} + task_id = data.get("taskId", "") + if not task_id: + self._json_reply(500, {"ok": False, "error": "Keine taskId in API-Antwort"}) + return self._json_reply(200, {"ok": True, "taskId": task_id}) def _handle_nanobanana_status(self): @@ -1060,11 +1071,12 @@ h1{color:#c0392b;}p{color:#888;} self._json_reply(500, {"ok": False, "error": result["error"]}) return - data = result.get("data", {}) + # Null-Safe: data kann None sein + data = result.get("data") or {} self._json_reply(200, { "ok": True, "successFlag": data.get("successFlag"), - "resultImageUrl": data.get("response", {}).get("resultImageUrl"), + "resultImageUrl": (data.get("response") or {}).get("resultImageUrl"), "completeTime": data.get("completeTime"), }) @@ -2064,10 +2076,17 @@ async function startGeneration() {{ method: 'POST', body: formData }}); - const data = await resp.json(); + + let data; + try {{ + data = await resp.json(); + }} catch (e) {{ + const text = await resp.text().catch(() => ''); + throw new Error('Server-Antwort nicht lesbar (Status ' + resp.status + '): ' + text.substring(0, 200)); + }} if (!data.ok) {{ - throw new Error(data.error || 'Unbekannter Fehler'); + throw new Error(data.error || 'Unbekannter Fehler (Status ' + resp.status + ')'); }} document.getElementById('spinnerText').textContent = 'Warte auf Ergebnis…';