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;
}