Как подождать подключения к Базе данных?

Как можно организовать запуск сервера только после установления соединения с базой данных (БД), используя имеющийся код для работы с PostgreSQL и Express?
  • 16 января 2024 г. 11:30
Ответы на вопрос 3
Для того чтобы подождать подключения к базе данных перед запуском сервера Express, вы можете использовать асинхронные функции в JavaScript. Например, если вы используете `node-postgres` (pg) для подключения к PostgreSQL, ваш код может выглядеть примерно так:

```javascript
const express = require('express');
const { Pool } = require('pg');

const pool = new Pool({
  user: 'your_user',
  host: 'localhost',
  database: 'your_database',
  password: 'your_password',
  port: 5432,
});

const app = express();
const port = 3000;

async function startServer() {
  try {
    // Подключаемся к БД
    await pool.connect();
    console.log('Подключение к базе данных успешно установлено.');

    // Запускаем сервер, если подключение к БД успешно
    app.listen(port, () => {
      console.log(`Сервер запущен на http://localhost:${port}`);
    });

  } catch (error) {
    console.error('Ошибка при подключении к базе данных:', error);
    process.exit(-1); // Завершаем процесс в случае ошибки
  }
}

startServer();

// Определяем роуты после этого, например:
app.get('/', (req, res) => {
  res.send('Главная страница');
});

// и т.д.
```

В этом примере функция `startServer` пытается установить соединение с базой данных с помощью асинхронной функции `connect`. Если соединение установлено успешно, сервер Express запускается методом `listen`. Если возникает ошибка при подключении к базе данных, сервер не запустится, а в консоль будет выведено сообщение об ошибке.

Обратите внимание на то, что метод `connect` из `node-postgres` нужен только для проверки соединения, и его необязательно вызывать при каждом запросе в вашем приложении, так как `pool` будет управлять соединениями автоматически.

Запускайте ваш сервер Express только после того, как убедитесь, что соединение с базой данных было установлено без ошибок. Это поможет избежать ситуаций, когда сервер будет принимать запросы, не имея возможности выполнять операции с базой данных.
Перед стартом приложения можно ожидать готовности СУБД, посредством проверки порта и, как только будет открыт - запускать приложение.
В docker-compose (к которому вы рано или поздно придёте) для этого существует depends_on . Проверять готовность постгреса лучше не тупо долбясь в порт, а с помощью pg_isready .
Похожие вопросы