diff --git a/public/calibration.html b/public/calibration.html index 8f62262..e79abb4 100644 --- a/public/calibration.html +++ b/public/calibration.html @@ -451,6 +451,13 @@ } }); + // Hilfsfunktion: fetch-Response sicher als Text lesen und in lesbaren Fehler umwandeln + async function safeJson(r) { + const raw = await r.text().catch(() => ''); + try { return { ok: r.ok, status: r.status, data: JSON.parse(raw) }; } + catch { return { ok: r.ok, status: r.status, data: null, raw: raw.slice(0, 300) }; } + } + // "NPZ speichern" → an Webcam-Service übertragen document.getElementById('btn-upload-npz').addEventListener('click', async () => { const camera = document.getElementById('cam-select-calib').value; @@ -458,15 +465,17 @@ logC(`NPZ wird an Webcam-Service übertragen (${camera}) …`); try { - const r = await fetch('/api/calibration/upload-npz', { + const { ok, status, data, raw } = await safeJson(await fetch('/api/calibration/upload-npz', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ camera }), - }); - const d = await r.json(); - if (d.error) { logC(`❌ Fehler: ${d.error}`); return; } - logC(`✅ Gespeichert: ${d.webcam?.saved} (${d.size} Bytes)`); - logC(` calibrationUrl: ${d.webcam?.calibrationUrl}`); + })); + if (!ok || data?.error) { + logC(`❌ HTTP ${status}: ${data?.error ?? raw ?? '(kein Fehlertext)'}`); + return; + } + logC(`✅ Gespeichert: ${data.webcam?.saved} (${data.size} Bytes)`); + logC(` calibrationUrl: ${data.webcam?.calibrationUrl}`); } catch (err) { logC(`❌ Fehler: ${err}`); } @@ -489,8 +498,11 @@ }); if (!response.ok) { - const err = await response.json().catch(() => ({ error: response.statusText })); - logC(`Fehler: ${err.error}`); + const raw = await response.text().catch(() => ''); + let msg; + try { msg = JSON.parse(raw).error || raw; } + catch { msg = raw.slice(0, 300) || response.statusText; } + logC(`❌ HTTP ${response.status}: ${msg || '(kein Fehlertext – evtl. Server neu starten?)'}`); return; }