Какова лучшая практика при подключении нескольких баз данных в node.js с использованием pg-обещания; - PullRequest
0 голосов
/ 10 ноября 2019

Я использую pg-обещание для создания приложения API. На основании предоставленного URL-запроса приложение должно подключиться к нужной базе данных и соответственно предоставить API. Например:

  • localhost: 3000 / data /: organizationId # 1 / data ==> подключиться к базе данных # 1 ==> ответ с данными # 1
  • localhost: 3000 /data /: organizationId # 2 / data ==> подключиться к базе данных # 2 ==> ответ с данными # 2

Насколько я понимаю, мне нужна какая-то логика для подключения к нужномубазы данных на основе URL, поэтому я попытался изменить строку подключения на основе переданного запроса, как показано в коде ниже.

Теперь эта установка отлично работает как демонстрационная версия, но она не практична, поскольку в случае нескольких запросов я легко достигаю max_connections и получаю сообщение об ошибке sorry, too many clients already до всех открытых запросов. закрыты.

Есть ли лучший способ справиться с этой проблемой? может быть, чтобы динамически проверить, нужно ли новое соединение перед тем, как фактически соединиться (то есть, чтобы избежать достижения максимального количества соединений)?

const config = require('config');
const squel = require('squel').useFlavour('postgres');
const pgp = require('pg-promise')();

function Model(koop) {}

Model.prototype.getData = function (req, callback) {

    if (req.organizationId === '1') {
        let db = pgp(config.db.postgis1); //connection based on organization Id #1
    }
    if (req.organizationId === '2') {
        let db = pgp(config.db.postgis2); //connection based on organization Id #2
    }
    db
        .query(formatSQL(req))
        .then(function (data) {
            // some function        
        })
        .catch(function (err) {
            callback({
                'error': 'error running query',
                'error_details': err
            });
        })
        .finally(pgp.end());
}

function formatSQL(req) { 
//some function
}

module.exports = Model
...