Ответ
В Node.js для работы с базами данных используются драйверы или ORM. Вот пример чтения данных из PostgreSQL с использованием библиотеки pg:
const { Pool } = require('pg');
// Создание пула соединений
const pool = new Pool({
user: 'dbuser',
host: 'localhost',
database: 'mydb',
password: 'secret',
port: 5432,
max: 20, // максимальное количество клиентов в пуле
idleTimeoutMillis: 30000,
connectionTimeoutMillis: 2000,
});
async function getActiveUsers() {
const client = await pool.connect();
try {
// Параметризованный запрос для защиты от SQL-инъекций
const queryText = 'SELECT id, name, email FROM users WHERE active = $1 AND created_at > $2';
const values = [true, '2024-01-01'];
const result = await client.query(queryText, values);
// Возвращаем строки результата
return result.rows;
} catch (error) {
console.error('Database query error:', error);
throw new Error('Failed to fetch users');
} finally {
// Важно всегда освобождать клиента обратно в пул
client.release();
}
}
// Использование с обработкой ошибок
getActiveUsers()
.then(users => {
console.log(`Found ${users.length} active users:`);
users.forEach(user => console.log(`- ${user.name} (${user.email})`));
})
.catch(err => console.error('Error:', err.message))
.finally(() => pool.end()); // закрытие пула при завершении приложения
Ключевые моменты:
- Пул соединений — позволяет эффективно управлять подключениями к БД
- Параметризованные запросы — защита от SQL-инъекций через плейсхолдеры
$1,$2 - Освобождение клиента —
client.release()возвращает соединение в пул - Обработка ошибок — try-catch-finally гарантирует освобождение ресурсов
- Асинхронность — использование async/await для работы с промисами
Для MongoDB с Mongoose пример будет другим:
const mongoose = require('mongoose');
async function findUsers() {
await mongoose.connect('mongodb://localhost:27017/mydb');
const users = await User.find({
active: true,
createdAt: { $gt: new Date('2024-01-01') }
}).select('name email');
return users;
}