bc/server/core/db.js

94 lines
6.4 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
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;
*/