From 8abb00c206e27db99aa1d3d1b38b09f1a1412a77 Mon Sep 17 00:00:00 2001 From: nadja Date: Wed, 26 Aug 2026 17:26:23 +0200 Subject: [PATCH] fix Analyse --- backend/analytics-db.js | 13 ++++++++++++- backend/server.js | 14 ++++++++++++++ frontend/src/api.js | 3 ++- frontend/src/pages/Analytics.jsx | 12 ++++++------ 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/backend/analytics-db.js b/backend/analytics-db.js index a22a3a9..a4a1dff 100644 --- a/backend/analytics-db.js +++ b/backend/analytics-db.js @@ -26,6 +26,7 @@ function saveDB(data) { } let db = loadDB(); +let dirty = false; function nextId() { db._counter = (db._counter || 0) + 1; @@ -45,10 +46,20 @@ export function trackEvent(type, userId, metadata = {}) { ...metadata, }; db.events.push(event); - saveDB(db); + dirty = true; return event; } +function flushToDisk() { + if (!dirty) return; + dirty = false; + saveDB(db); +} + +setInterval(flushToDisk, 5000); +process.on('SIGTERM', () => { flushToDisk(); process.exit(0); }); +process.on('SIGINT', () => { flushToDisk(); process.exit(0); }); + export function getEvents({ from, to, type, user_id, limit = 100 } = {}) { let results = [...db.events]; diff --git a/backend/server.js b/backend/server.js index 921e3e1..b539408 100644 --- a/backend/server.js +++ b/backend/server.js @@ -40,6 +40,20 @@ app.use('/api/auth', authRouter); app.use('/api/recipes', recipesRouter); app.use('/api/analytics', authMiddleware, adminMiddleware, analyticsRouter); +app.use((err, req, res, next) => { + console.error('Server Fehler:', err.message); + if (!res.headersSent) { + res.status(500).json({ error: 'Interner Serverfehler' }); + } +}); + +process.on('uncaughtException', (err) => { + console.error('Uncaught Exception:', err.message); +}); +process.on('unhandledRejection', (err) => { + console.error('Unhandled Rejection:', err?.message || err); +}); + const adminUser = process.env.ADMIN_USER || 'admin'; const adminPass = process.env.ADMIN_PASS || 'admin123'; diff --git a/frontend/src/api.js b/frontend/src/api.js index 0356a5c..46fd2d4 100644 --- a/frontend/src/api.js +++ b/frontend/src/api.js @@ -82,7 +82,8 @@ async function analyticsFetch(url, token) { try { msg = JSON.parse(text).error || msg; } catch {} throw new Error(msg); } - return JSON.parse(text); + if (!text) return []; + try { return JSON.parse(text); } catch { return []; } } export async function fetchAnalyticsOverview(token) { diff --git a/frontend/src/pages/Analytics.jsx b/frontend/src/pages/Analytics.jsx index 6d2f14e..7dec5b4 100644 --- a/frontend/src/pages/Analytics.jsx +++ b/frontend/src/pages/Analytics.jsx @@ -77,16 +77,16 @@ export default function Analytics() { const load = async () => { try { const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString().slice(0, 10); - const [ov, pv, us, act] = await Promise.all([ - fetchAnalyticsOverview(token), + const ov = await fetchAnalyticsOverview(token); + setOverview(ov); + const [pv, us, act] = await Promise.allSettled([ fetchAnalyticsPageviews(token, thirtyDaysAgo), fetchAnalyticsUsers(token), fetchAnalyticsActivity(token), ]); - setOverview(ov); - setPageviews(pv); - setUsers(us); - setActivity(act); + if (pv.status === 'fulfilled') setPageviews(pv.value); + if (us.status === 'fulfilled') setUsers(us.value); + if (act.status === 'fulfilled') setActivity(act.value); } catch (e) { console.error('Analytics Fehler:', e); setError(e.message);