// /server/core/db.js require('dotenv').config({ path: require('node:path').resolve(process.cwd(), '.env') }); // Загружаем переменные из .env в process.env const mysql = require('mysql2'); // Используем mysql2 для поддержки промисов и улучшенной производительности // Конфигурация подключения к вашей базе данных MySQL // Значения теперь берутся из переменных окружения (файла .env) const dbConfig = { host: process.env.DB_HOST || 'localhost', user: process.env.DB_USER, // Обязательно должно быть задано в .env password: process.env.DB_PASSWORD, // Обязательно должно быть задано в .env database: process.env.DB_NAME, // Обязательно должно быть задано в .env port: parseInt(process.env.DB_PORT || '3306', 10), // Порт по умолчанию 3306, если не указан waitForConnections: process.env.DB_WAIT_FOR_CONNECTIONS ? (process.env.DB_WAIT_FOR_CONNECTIONS === 'true') : true, connectionLimit: parseInt(process.env.DB_CONNECTION_LIMIT || '10', 10), queueLimit: parseInt(process.env.DB_QUEUE_LIMIT || '0', 10) }; // Проверка, что все обязательные переменные окружения для БД заданы if (!dbConfig.user || !dbConfig.password || !dbConfig.database || !dbConfig.host) { console.error('[DB FATAL] Не все обязательные переменные окружения для БД заданы!'); console.error('Убедитесь, что у вас есть файл .env в корне проекта и он содержит как минимум:'); console.error('DB_HOST, DB_USER, DB_PASSWORD, DB_NAME'); console.error('Текущие загруженные (некоторые могут быть undefined):'); console.error(` DB_HOST: ${process.env.DB_HOST}`); console.error(` DB_USER: ${process.env.DB_USER}`); console.error(` DB_PASSWORD: ${process.env.DB_PASSWORD ? '****** (задано)' : 'undefined'}`); // Не выводим пароль в лог console.error(` DB_NAME: ${process.env.DB_NAME}`); console.error(` DB_PORT: ${process.env.DB_PORT}`); process.exit(1); // Завершаем приложение, так как без БД оно не сможет работать корректно. } // Создаем пул соединений. let pool; try { pool = mysql.createPool(dbConfig); console.log('[DB] Пул соединений MySQL успешно создан с конфигурацией из переменных окружения.'); } catch (error) { console.error('[DB FATAL] Не удалось создать пул соединений MySQL. Проверьте конфигурацию и переменные окружения. Ошибка:', error); process.exit(1); } // Обертка для выполнения запросов с использованием промисов из пула const promisePool = pool.promise(); // Проверка соединения (опционально, но полезно для отладки при запуске) if (promisePool) { promisePool.getConnection() .then(connection => { console.log(`[DB] Успешно подключено к базе данных MySQL (${dbConfig.database}) на ${dbConfig.host}:${dbConfig.port} и получено соединение из пула.`); 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}'. Проверьте имя пользователя и пароль в вашем файле .env.`); } else if (err.code === 'ER_BAD_DB_ERROR') { console.error(`[DB] База данных "${dbConfig.database}" не найдена. Убедитесь, что она создана на сервере MySQL и указана верно в .env (DB_NAME).`); } else { console.error(`[DB] Неизвестная ошибка подключения к MySQL. Код: ${err.code}`); } // process.exit(1); // Раскомментируйте, если хотите падать при ошибке подключения }); } else { console.error('[DB FATAL] promisePool не был создан. Это не должно было случиться.'); process.exit(1); } // Экспортируем пул с промисами 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; */