diff --git a/App.tsx b/App.tsx index 33c55ef..db4720b 100644 --- a/App.tsx +++ b/App.tsx @@ -77,10 +77,13 @@ const MapResizer = () => { }; const AdSenseComponent = () => { + const loadedRef = useRef(false); useEffect(() => { + if (loadedRef.current) return; try { // @ts-ignore (window.adsbygoogle = window.adsbygoogle || []).push({}); + loadedRef.current = true; } catch (e) { console.error('AdSense error:', e); } diff --git a/package-lock.json b/package-lock.json index 1f6769c..5b7e948 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@google/genai": "1.40.0", "cors": "^2.8.6", + "dotenv": "^17.3.1", "express": "^5.2.1", "leaflet": "1.9.4", "lucide-react": "0.460.0", @@ -2168,6 +2169,18 @@ "node": ">=8" } }, + "node_modules/dotenv": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", + "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", diff --git a/package.json b/package.json index ed2cd9c..1afa268 100644 --- a/package.json +++ b/package.json @@ -5,12 +5,14 @@ "type": "module", "scripts": { "dev": "vite", + "server": "node server.js", "build": "vite build", "preview": "vite preview" }, "dependencies": { "@google/genai": "1.40.0", "cors": "^2.8.6", + "dotenv": "^17.3.1", "express": "^5.2.1", "leaflet": "1.9.4", "lucide-react": "0.460.0", diff --git a/server.js b/server.js index d8515ee..349cff1 100644 --- a/server.js +++ b/server.js @@ -1,3 +1,4 @@ +import "dotenv/config"; import express from 'express'; import mysql from 'mysql2/promise'; import cors from 'cors'; @@ -55,7 +56,8 @@ async function initializeDB() { const [rows] = await pool.query('SELECT COUNT(*) as count FROM markers'); console.log(`[DB] Current Status: ${rows[0].count} markers stored in database.`); } catch (error) { - console.error('[DB] MariaDB connection failed:', error.message); + console.error('[DB] MariaDB connection failed details:', error); + console.error('[DB] Host:', dbConfig.host); process.exit(1); } } @@ -74,8 +76,8 @@ app.get('/api/markers', async (req, res) => { })); res.json(formattedMarkers); } catch (error) { - console.error(error); - res.status(500).json({ error: 'Failed to fetch markers' }); + console.error('[API] GET Markers Error:', error); + res.status(500).json({ error: 'Failed to fetch markers', detail: error.message }); } }); @@ -97,8 +99,8 @@ app.post('/api/markers', async (req, res) => { if (isDebug) console.log(`[API] Successfully saved marker: ${id}`); res.json({ success: true }); } catch (error) { - console.error(error); - res.status(500).json({ error: 'Failed to save marker' }); + console.error('[API] POST Marker Error:', error); + res.status(500).json({ error: 'Failed to save marker', detail: error.message }); } });