Some checks failed
Deploy Project BC / deploy (push) Failing after 33s
94 lines
6.4 KiB
JavaScript
94 lines
6.4 KiB
JavaScript
// /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;
|
||
|
||
*/ |