fix: Error Handling in Backend und Frontend verbessern (Phase 5, Schritt 31)

- Backend: JSON-Parse-Error + Payload-Too-Large Middleware in index.js
- Backend: Dashboard äußerer try/catch für db.get()-Fehler
- Backend: contacts/meta Route mit try/catch
- Frontend: try/catch + Toast-Fallback in loadMonth (budget), loadRange (calendar),
  loadWeek (meals), loadLists/switchList (shopping), initiales Laden (notes)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
ulsklyc
2026-03-26 00:35:16 +01:00
parent e068a14819
commit 2e3e67baeb
8 changed files with 75 additions and 19 deletions
+15 -7
View File
@@ -54,13 +54,21 @@ function addMonths(ym, n) {
// --------------------------------------------------------
async function loadMonth(month) {
const [entriesRes, summaryRes] = await Promise.all([
api.get(`/budget?month=${month}`),
api.get(`/budget/summary?month=${month}`),
]);
state.month = month;
state.entries = entriesRes.data;
state.summary = summaryRes.data;
try {
const [entriesRes, summaryRes] = await Promise.all([
api.get(`/budget?month=${month}`),
api.get(`/budget/summary?month=${month}`),
]);
state.month = month;
state.entries = entriesRes.data;
state.summary = summaryRes.data;
} catch (err) {
console.error('[Budget] loadMonth Fehler:', err);
state.month = month;
state.entries = [];
state.summary = { income: 0, expenses: 0, balance: 0, by_category: [] };
window.oikos?.showToast('Budget konnte nicht geladen werden.', 'danger');
}
}
// --------------------------------------------------------
+8 -2
View File
@@ -124,8 +124,14 @@ function eventsOnDay(dateStr) {
// --------------------------------------------------------
async function loadRange(from, to) {
const res = await api.get(`/calendar?from=${from}&to=${to}`);
state.events = res.data;
try {
const res = await api.get(`/calendar?from=${from}&to=${to}`);
state.events = res.data;
} catch (err) {
console.error('[Calendar] loadRange Fehler:', err);
state.events = [];
window.oikos?.showToast('Termine konnten nicht geladen werden.', 'danger');
}
state.rangeFrom = from;
state.rangeTo = to;
}
+10 -3
View File
@@ -74,9 +74,16 @@ function formatDayDate(dateStr) {
// --------------------------------------------------------
async function loadWeek(week) {
const res = await api.get(`/meals?week=${week}`);
state.meals = res.data;
state.currentWeek = getMondayOf(week);
try {
const res = await api.get(`/meals?week=${week}`);
state.meals = res.data;
state.currentWeek = getMondayOf(week);
} catch (err) {
console.error('[Meals] loadWeek Fehler:', err);
state.meals = [];
state.currentWeek = getMondayOf(week);
window.oikos?.showToast('Essensplan konnte nicht geladen werden.', 'danger');
}
}
async function loadLists() {
+8 -2
View File
@@ -58,8 +58,14 @@ export async function render(container, { user }) {
if (window.lucide) lucide.createIcons();
const res = await api.get('/notes');
state.notes = res.data;
try {
const res = await api.get('/notes');
state.notes = res.data;
} catch (err) {
console.error('[Notes] Laden fehlgeschlagen:', err);
state.notes = [];
window.oikos?.showToast('Notizen konnten nicht geladen werden.', 'danger');
}
renderGrid();
_container.querySelector('#notes-add-btn').addEventListener('click', () => openModal({ mode: 'create' }));
+11 -3
View File
@@ -351,8 +351,14 @@ function updateListCounter(listId, totalDelta, checkedDelta) {
// --------------------------------------------------------
async function loadLists() {
const data = await api.get('/shopping');
state.lists = data.data ?? [];
try {
const data = await api.get('/shopping');
state.lists = data.data ?? [];
} catch (err) {
console.error('[Shopping] loadLists Fehler:', err);
state.lists = [];
window.oikos?.showToast('Listen konnten nicht geladen werden.', 'danger');
}
}
async function loadItems(listId) {
@@ -366,9 +372,11 @@ async function switchList(listId, container) {
renderTabs(container);
try {
await loadItems(listId);
} catch {
} catch (err) {
console.error('[Shopping] loadItems Fehler:', err);
state.items = [];
state.activeList = state.lists.find((l) => l.id === listId) ?? null;
window.oikos?.showToast('Artikel konnten nicht geladen werden.', 'danger');
}
renderListContent(container);
wireListContentEvents(container);