const { Pool } = require('pg'); require('dotenv').config(); // Выводим настройки подключения (без пароля) console.log('Настройки подключения к базе данных:'); console.log('DATABASE_URL:', process.env.DATABASE_URL?.replace(/:([^:@]+)@/, ':***@')); console.log('DB_HOST:', process.env.DB_HOST); console.log('DB_PORT:', process.env.DB_PORT); console.log('DB_NAME:', process.env.DB_NAME); console.log('DB_USER:', process.env.DB_USER); // Создаем пул соединений с базой данных const pool = new Pool({ connectionString: process.env.DATABASE_URL, ssl: process.env.NODE_ENV === 'production' ? { rejectUnauthorized: false } : false, }); // Проверяем подключение к базе данных pool.query('SELECT NOW()') .then(res => { console.log('Успешное подключение к базе данных:', res.rows[0]); }) .catch(err => { console.error('Failed to connect to the database using DATABASE_URL:', err); console.log('Attempting alternative database connection...'); // Пробуем альтернативное подключение const altPool = new Pool({ host: process.env.DB_HOST || 'localhost', port: parseInt(process.env.DB_PORT || '5432'), database: process.env.DB_NAME || 'dapp_db', user: process.env.DB_USER || 'dapp_user', password: process.env.DB_PASSWORD, }); altPool.query('SELECT NOW()') .then(altRes => { console.log('Альтернативное подключение успешно:', altRes.rows[0]); // Заменяем основной пул на альтернативный module.exports.pool = altPool; module.exports.query = (text, params) => altPool.query(text, params); }) .catch(altErr => { console.error('Альтернативное подключение тоже не удалось:', altErr); console.log('Переключение на временное хранилище данных в памяти...'); module.exports = createInMemoryStorage(); }); }); // Функция для выполнения SQL-запросов const query = (text, params) => { return pool.query(text, params); }; // Функция для сохранения гостевого сообщения в базе данных async function saveGuestMessageToDatabase(message, language, guestId) { try { await query( ` INSERT INTO guest_messages (guest_id, content, language, created_at) VALUES ($1, $2, $3, NOW()) `, [guestId, message, language] ); console.log('Гостевое сообщение успешно сохранено:', message); } catch (error) { console.error('Ошибка при сохранении гостевого сообщения:', error); throw error; // Пробрасываем ошибку дальше } } // Экспортируем функции для работы с базой данных module.exports = { query, pool, saveGuestMessageToDatabase, }; // Функция для создания временного хранилища данных в памяти function createInMemoryStorage() { console.log('Используется временное хранилище данных в памяти'); const users = []; let userId = 1; // Эмуляция функции query для работы с пользователями const inMemoryQuery = async (text, params) => { console.log('SQL query (in-memory):', text, 'Params:', params); // Эмуляция запроса SELECT * FROM users WHERE address = $1 if (text.includes('SELECT * FROM users WHERE address = $1')) { const address = params[0]; const user = users.find((u) => u.address === address); return { rows: user ? [user] : [] }; } // Эмуляция запроса SELECT * FROM users WHERE email = $1 if (text.includes('SELECT * FROM users WHERE email = $1')) { const email = params[0]; const user = users.find((u) => u.email === email); return { rows: user ? [user] : [] }; } // Эмуляция запроса INSERT INTO users if (text.includes('INSERT INTO users')) { let newUser; if (text.includes('address')) { newUser = { id: userId++, address: params[0], created_at: new Date(), is_admin: false }; } else if (text.includes('email')) { newUser = { id: userId++, email: params[0], created_at: new Date(), is_admin: false }; } if (newUser) { users.push(newUser); return { rows: [newUser] }; } } return { rows: [] }; }; return { query: inMemoryQuery, pool: { query: (text, params, callback) => { if (callback) { try { const result = inMemoryQuery(text, params); callback(null, result); } catch (err) { callback(err); } } else { return inMemoryQuery(text, params); } }, }, }; }