petushok55
@petushok55
Обучаюсь на практике.

Как подождать, пока будет подключена База данных?

У меня есть файл с подключением к бд:
spoiler

import pg from 'pg'
export const pool = new pg.Pool({
    host: '',
    port: ,
    database: '',
    user: '',
    password: ''
})

pool.connect((err, client, release) => {
    if (err) {
        return console.error('Ошибка в запросе к БД (1)', err.stack)
    }
    client.query('SELECT NOW()', (err, result) => {
        release()
        if (err) {
            return console.error('Ошибка в запросе к БД (2)', err.stack)
        }
        console.log('\x1b[34m%s\x1b[0m',`PostgreSQL is running (${result.rows[0].now})`);
    })
})



А есть главный файл, где делаю так:
import { pool } from './postgresDB.js';
import express from 'express';

const app = express();
const ip = 'localhost';
const port = 3000;


app.get('/', (req, res) => {
    pool.query('SELECT * FROM users', (err, result) => {
        if (err) {
            res.status(500).send('Ошибка при получении данных из базы данных');
        } else {
            res.json(result.rows);
        }
    });
});

app.listen(port, ip, () => {
    console.log(`Сервер запущен на адресе ${ip} и порту ${port}`);
});


Хочу сделать, чтоб сервер подключался только после коннекта БД, перепробовал разные способы, но не смог
  • Вопрос задан
  • 181 просмотр
Решения вопроса 1
Kentavr16
@Kentavr16
long cold winter
можно использовать что-то вроде
import express from "express";

const app = express();
const ip = "localhost";
const port = 4000;

app.get("/", (req, res) => {
  res.send("some response");
});

function startServer() {
  app.listen(port, ip, () => {
    console.log(`Сервер запущен на адресе ${ip} и порту ${port}`);
  });
}

async function connectToDatabase() {
  return new Promise((resolve, reject) => {
    setTimeout(() => resolve("ok"), 2000);
  });
}

connectToDatabase()
  .then(() => {
    startServer();
    console.log("Успешное подключение к базе данных.");
  })
  .catch((err) => {
    console.error("Не удалось подключиться к базе данных:", err);
  });

где для коннекта к бд использовать промис
export function connectToDatabase() {
    return new Promise((resolve, reject) => {
        pool.connect((err, client, release) => {
            if (err) {
                console.error('Ошибка в запросе к БД (1)', err.stack);
                release();
                reject(err);
                return;
            }

            client.query('SELECT NOW()', (err, result) => {
                release();
                if (err) {
                    console.error('Ошибка в запросе к БД (2)', err.stack);
                    reject(err);
                    return;
                }

                console.log('\x1b[34m%s\x1b[0m', `PostgreSQL is running (${result.rows[0].now})`);
                resolve(pool);
            });
        });
    });
}

Ну и пул объявить не забыть. Хз, с обычным промисом который в первом примере, работает окей, почему с подключением к бд будет иначе? Для эксперимента ставить pg неохота. Вполне возможно что я что-то проглядел, поправьте, с серверами на ноде давно не имел дела.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Перед стартом приложения можно ожидать готовности СУБД, посредством проверки порта и, как только будет открыт - запускать приложение.

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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы