// /server/core/db.js const mysql = require('mysql2'); // Используем mysql2 для поддержки промисов и улучшенной производительности // Конфигурация подключения к вашей базе данных MySQL // ЗАМЕНИТЕ значения на ваши реальные данные! const dbConfig = { //Данные для сервера user phpmyadmin password Innamorato8Art host: 'localhost', // или IP-адрес вашего MySQL сервера user: 'phpmyadmin', // Имя пользователя MySQL (например, 'root' для локальной разработки) password: 'Innamorato8Art', // Пароль пользователя MySQL database: 'your_game_db', // Имя вашей базы данных (например, 'your_game_db') port: 3306, // Стандартный порт MySQL, измените если у вас другой waitForConnections: true, // Ожидать доступного соединения, если все заняты connectionLimit: 10, // Максимальное количество соединений в пуле queueLimit: 0 // Максимальное количество запросов в очереди (0 = безлимитно) }; // Создаем пул соединений. Пул более эффективен для веб-приложений, // чем создание нового соединения для каждого запроса. let pool; try { pool = mysql.createPool(dbConfig); console.log('[DB] Пул соединений MySQL успешно создан.'); } catch (error) { console.error('[DB FATAL] Не удалось создать пул соединений MySQL. Проверьте конфигурацию `dbConfig`. Ошибка:', error); // Если пул не создался, дальнейшая работа с БД невозможна. // Завершаем приложение, так как без БД оно не сможет работать корректно. process.exit(1); } // Обертка для выполнения запросов с использованием промисов из пула // Мы экспортируем именно эту обертку. const promisePool = pool.promise(); // Проверка соединения (опционально, но полезно для отладки при запуске) // Делаем это после экспорта, чтобы модуль мог быть загружен даже если проверка упадет, // хотя в данном случае мы завершаем процесс, если пул не создался. if (promisePool) { // Проверяем, что promisePool был успешно создан promisePool.getConnection() .then(connection => { console.log('[DB] Успешно подключено к базе данных MySQL и получено соединение из пула.'); connection.release(); // Важно!!! Возвращаем соединение в пул console.log('[DB] Соединение возвращено в пул.'); }) .catch(err => { console.error('[DB] Ошибка при попытке получить соединение из пула или при подключении к MySQL:', err.message); // Выводим полный объект ошибки для диагностики, если это не просто ошибка конфигурации if (err.code !== 'ER_ACCESS_DENIED_ERROR' && err.code !== 'ER_BAD_DB_ERROR' && err.code !== 'ECONNREFUSED') { console.error('[DB] Полные детали ошибки:', err); } if (err.code === 'PROTOCOL_CONNECTION_LOST') { console.error('[DB] Соединение с БД было потеряно.'); } else if (err.code === 'ER_CON_COUNT_ERROR') { console.error('[DB] В БД слишком много соединений.'); } else if (err.code === 'ECONNREFUSED') { console.error(`[DB] Соединение с БД было отклонено. Убедитесь, что сервер MySQL запущен и доступен по адресу ${dbConfig.host}:${dbConfig.port}.`); } else if (err.code === 'ER_ACCESS_DENIED_ERROR') { console.error(`[DB] Доступ к БД запрещен для пользователя '${dbConfig.user}'. Проверьте имя пользователя и пароль в server/core/db.js.`); } else if (err.code === 'ER_BAD_DB_ERROR') { console.error(`[DB] База данных "${dbConfig.database}" не найдена. Убедитесь, что она создана на сервере MySQL.`); } else { console.error(`[DB] Неизвестная ошибка подключения к MySQL. Код: ${err.code}`); } // В продакшене здесь может быть логика переподключения или более изящного завершения работы. // Для разработки важно видеть эти ошибки. // Можно раскомментировать process.exit(1), если хотите, чтобы приложение падало при ошибке подключения к БД. // process.exit(1); }); } else { // Эта ветка не должна выполниться, если pool.promise() не выбросил ошибку выше. // Но на всякий случай оставляем лог. console.error('[DB FATAL] promisePool не был создан. Проверьте создание `pool`.'); process.exit(1); // Завершаем, так как это критическая ошибка } // Экспортируем пул с промисами, чтобы его можно было использовать в других модулях (например, в authService.js) module.exports = promisePool; /* Пример SQL для создания таблицы пользователей (если ее еще нет): CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(255) NOT NULL UNIQUE, password_hash VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; */