90 lines
6.7 KiB
JavaScript
90 lines
6.7 KiB
JavaScript
// /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;
|
||
|
||
*/ |