Приведи пример запроса на чтение в БД на Node.js

Ответ

В 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()); // закрытие пула при завершении приложения

Ключевые моменты:

  1. Пул соединений — позволяет эффективно управлять подключениями к БД
  2. Параметризованные запросы — защита от SQL-инъекций через плейсхолдеры $1, $2
  3. Освобождение клиентаclient.release() возвращает соединение в пул
  4. Обработка ошибок — try-catch-finally гарантирует освобождение ресурсов
  5. Асинхронность — использование 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;
}