From 3aa442e0fa4d2da659c2d63e43fd7c07f9cf34d7 Mon Sep 17 00:00:00 2001 From: choibk Date: Mon, 26 Jan 2026 09:33:53 +0900 Subject: [PATCH] [FIX] Enhanced DB diagnostic messages for connection testing --- server/routes/system.js | 22 +++++++++++++++++++++- src/platform/pages/BasicSettingsPage.tsx | 6 +++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/server/routes/system.js b/server/routes/system.js index 576aa87..36cab35 100644 --- a/server/routes/system.js +++ b/server/routes/system.js @@ -153,6 +153,20 @@ router.post('/test-db', isAuthenticated, hasRole('admin'), async (req, res) => { let conn; try { + // 1. Try to connect without specifying database first to see if credentials/host are OK + try { + const basicConn = await mysql.createConnection({ + host, user, password, port: parseInt(port) || 3306, connectTimeout: 3000 + }); + await basicConn.end(); + } catch (basicErr) { + return res.status(400).json({ + success: false, + error: `서버 접속 실패: 계정 정보나 호스트/포트를 확인하세요. (${basicErr.message})` + }); + } + + // 2. Try to connect with database conn = await mysql.createConnection({ host, user, @@ -164,7 +178,13 @@ router.post('/test-db', isAuthenticated, hasRole('admin'), async (req, res) => { await conn.query('SELECT 1'); res.json({ success: true, message: '연결 성공: 데이터베이스에 성공적으로 접속되었습니다.' }); } catch (err) { - res.status(400).json({ success: false, error: err.message }); + let msg = err.message; + if (err.code === 'ER_BAD_DB_ERROR') { + msg = `데이터베이스 '${database}'가 존재하지 않습니다. MariaDB에서 스키마를 먼저 생성해 주세요.`; + } else if (err.code === 'ER_ACCESS_DENIED_ERROR') { + msg = '사용자 계정 또는 비밀번호가 일치하지 않거나, 해당 DB에 대한 접근 권한이 없습니다.'; + } + res.status(400).json({ success: false, error: msg }); } finally { if (conn) await conn.end(); } diff --git a/src/platform/pages/BasicSettingsPage.tsx b/src/platform/pages/BasicSettingsPage.tsx index 6e0013e..7b0445b 100644 --- a/src/platform/pages/BasicSettingsPage.tsx +++ b/src/platform/pages/BasicSettingsPage.tsx @@ -151,7 +151,11 @@ export function BasicSettingsPage() { setTestResult({ success: true, message: res.data.message }); setIsDbVerified(true); } catch (error: any) { - setTestResult({ success: false, message: error.response?.data?.error || '접속 테스트에 실패했습니다.' }); + const detailedError = error.response?.data?.error || error.message || '알 수 없는 오류가 발생했습니다.'; + setTestResult({ + success: false, + message: `접속 실패: ${detailedError}` + }); setIsDbVerified(false); } finally { setTesting(false);