From d31026a60666253b5c358fcce65ed7ee1ad22b05 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Fri, 4 Sep 2026 15:05:12 +0200 Subject: [PATCH] =?UTF-8?q?Verbessere=20Fehlerbehandlung=20beim=20Import?= =?UTF-8?q?=20von=20TTR-Werten:=20K=C3=BCrze=20Fehlermeldungen=20im=20CMS?= =?UTF-8?q?=20und=20schreibe=20vollst=C3=A4ndige=20Details=20ins=20Serverl?= =?UTF-8?q?og.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/cms/mytischtennis.vue | 2 +- server/api/cms/mytischtennis/import.post.js | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/pages/cms/mytischtennis.vue b/pages/cms/mytischtennis.vue index 60a4a87..514ba7b 100644 --- a/pages/cms/mytischtennis.vue +++ b/pages/cms/mytischtennis.vue @@ -43,6 +43,6 @@ const busy = ref(false); const message = ref(''); const error = ref(false) const formattedLastImport = computed(() => status.value.lastSuccessfulImportAt ? new Intl.DateTimeFormat('de-DE', { dateStyle: 'medium', timeStyle: 'short' }).format(new Date(status.value.lastSuccessfulImportAt)) : 'noch nie') async function load() { status.value = await $fetch('/api/cms/mytischtennis') } async function save() { busy.value = true; message.value = ''; error.value = false; try { status.value = await $fetch('/api/cms/mytischtennis', { method: 'PUT', body: form }); form.password = ''; message.value = 'Zugang verschlüsselt gespeichert.' } catch { error.value = true; message.value = 'Zugang konnte nicht gespeichert werden.' } finally { busy.value = false } } -async function runImport() { busy.value = true; message.value = ''; error.value = false; try { const result = await $fetch('/api/cms/mytischtennis/import', { method: 'POST' }); message.value = `${result.rowCount} Werte wurden aktualisiert.`; await load() } catch (caught) { error.value = true; message.value = caught?.data?.statusMessage || 'Abruf fehlgeschlagen.'; await load().catch(() => {}) } finally { busy.value = false } } +async function runImport() { busy.value = true; message.value = ''; error.value = false; try { const result = await $fetch('/api/cms/mytischtennis/import', { method: 'POST' }); message.value = `${result.rowCount} Werte wurden aktualisiert.`; await load() } catch (caught) { error.value = true; message.value = caught?.data?.message || 'Abruf fehlgeschlagen. Details stehen im Serverlog.'; await load().catch(() => {}) } finally { busy.value = false } } onMounted(load) diff --git a/server/api/cms/mytischtennis/import.post.js b/server/api/cms/mytischtennis/import.post.js index b9c2d93..3542ed3 100644 --- a/server/api/cms/mytischtennis/import.post.js +++ b/server/api/cms/mytischtennis/import.post.js @@ -13,9 +13,12 @@ export default defineEventHandler(async (event) => { const result = await importQttrValues({ connection }) return { success: true, rowCount: result.rowCount, importedAt: result.importedAt } } catch (error) { - const detail = String(error.message || error).slice(0, 500) - console.error('[mytischtennis] TTR-Abruf fehlgeschlagen:', detail) + const fullDetail = String(error.stack || error.message || error) + const detail = fullDetail.slice(0, 500) + // Vollständig nur ins serverseitige PM2-Log schreiben; im CMS wird der Fehler + // bewusst gekürzt gespeichert, damit Browser-/Systempfade nicht öffentlich werden. + console.error('[mytischtennis] TTR-Abruf fehlgeschlagen:', fullDetail) await saveMyTischtennisConnection({ ...connection, lastImportError: detail }) - throw createError({ statusCode: 502, statusMessage: `TTR-Abruf fehlgeschlagen: ${detail}` }) + throw createError({ statusCode: 502, message: 'TTR-Abruf fehlgeschlagen. Details stehen im Serverlog.' }) } })