bc/server/core/db.js
2025-05-18 10:50:38 +03:00

90 lines
6.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// /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;
*/