2025-05-13 04:14:01 +00:00

92 lines
7.0 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_modules/db.js
const mysql = require('mysql2'); // Используем mysql2 для поддержки промисов и улучшенной производительности
// Конфигурация подключения к вашей базе данных MySQL
// ЗАМЕНИТЕ значения на ваши реальные данные!
const dbConfig = {
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);
} catch (error) {
console.error('[DB FATAL] Не удалось создать пул соединений MySQL. Проверьте конфигурацию `dbConfig`. Ошибка:', error);
// Если пул не создался, дальнейшая работа с БД невозможна.
// Можно завершить приложение или попытаться пересоздать пул позже.
// Для простоты, мы просто выведем ошибку. Приложение, скорее всего, упадет при попытке использовать `pool`.
// В реальном приложении здесь нужна более надежная обработка.
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);
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 запущен и доступен по указанному хосту и порту.');
} else if (err.code === 'ER_ACCESS_DENIED_ERROR') {
console.error(`[DB] Доступ к БД запрещен для пользователя '${dbConfig.user}'. Проверьте имя пользователя и пароль в db.js.`);
} else if (err.code === 'ER_BAD_DB_ERROR') {
console.error(`[DB] База данных "${dbConfig.database}" не найдена. Убедитесь, что она создана.`);
} else {
console.error(`[DB] Неизвестная ошибка подключения к MySQL. Код: ${err.code}`);
}
// В продакшене здесь может быть логика переподключения или более изящного завершения работы.
// Для отладки сейчас важно видеть эти ошибки.
// process.exit(1); // Можно раскомментировать, если хотите жестко падать при ошибке подключения
});
} else {
console.error('[DB FATAL] promisePool не был создан. Проверьте создание `pool`.');
}
// Экспортируем пул с промисами, чтобы его можно было использовать в других модулях (например, в auth.js)
module.exports = promisePool;
/*
Пример использования в другом файле (например, auth.js):
const db = require('./db'); // db здесь будет promisePool
async function getUser(username) {
if (!db) { // Дополнительная проверка на случай, если db не экспортировался
console.error("DB модуль не загружен или не экспортировал promisePool!");
throw new Error("DB connection is not available.");
}
try {
const [rows, fields] = await db.query('SELECT * FROM users WHERE username = ?', [username]);
return rows[0]; // Возвращаем первого найденного пользователя или undefined
} catch (error) {
console.error("Ошибка при получении пользователя:", error);
throw error; // или обработать ошибку иначе
}
}
*/