Как отключить пул в модуле pg

Итак, я использую модуль pg в узле 8.11.1 / express 4.16.3 / pg 7.4.2

Я пытаюсь использовать пул для моего интерфейса (просто выбирает), и примеры несколько запутаны.

При подключении он использует только новый пул, а затем показывает, что мне нужно сделать pool.end()

const pool = new Pool({
  user: 'dbuser',
  host: 'database.server.com',
  database: 'mydb',
  password: 'secretpassword',
  port: 3211,
})

pool.query('SELECT NOW()', (err, res) => {
  console.log(err, res)
  pool.end()
})

Я сделал свой код так, и он печатает Error: Cannot use a pool after calling end on the pool Если я сделаю один и тот же запрос пару раз. Так что нет pool.end()

В запросах нет отключения в примерах (?)

Я наконец сделал свой код как пул. Это показывает pool.on('error', (err, client) => { функция, а затем использует client.release() в пуле, так как "pool.query делегирует непосредственно в client.query внутри", я полагаю?

Итак, как правильно использовать пул в pg и как отключаться после каждого запроса или сбоя? Я придумал это

const pool = new pg.Pool({
  user: 'user',
  host: 'localhost',
  database: 'myProject',
  password: 'secret',
  port: 5432
});

pool.on('error', (err, client) => {
  console.error('error on client', err, 'on client' , client);
  process.exit(-1);
});

app.get('/', (req, res)=>{
  pool.connect()
    .then(client => {
      return client.query('select name from table')
           .then(resolved => {
              client.release();
              res.render('index',{'testData': resolved.rows});
            })
            .catch(e => { //return client.query
              client.release();
              res.render('index',{'errorData': e});
            })
      .catch(e => { //pool.connect()
        client.release();
        res.render('index',{'errorData': e});
      })
    })
});

Я не знаю, может ли это быть короче в любом случае. Как, например, если catch(e => { ////pool.connect()... необходимо или покрыто pool.on('error', (err, client) => {...

Кроме того, это могло бы быть намного сортировщиком, если бы это было как

const pool = new pg.Pool({
  user: 'user',
  host: 'localhost',
  database: 'myProject',
  password: 'secret',
  port: 5432
});
app.get('/', (req, res)=>{
  pool.query('...')
  .then(resolved => {          
      pool.end();// pool disconnect ???
      res.render('index',{
        'testData': resolved.rows
      });
  })
  .catch(e => {
      pool.end();// pool disconnect ???
      res.render('index',{
        'testData': e
      });
  })
});

Но я не знаю, правильно ли это, потому что нет pool.connect нет клиента, возвращенного из этого соединения, и нет функции для отключения пула (только для его завершения, который снова заканчивается Error: Cannot use a pool after calling end on the pool).

Пожалуйста, совет по правильному использованию пула и синтаксиса

Спасибо

1 ответ

Я столкнулся с такой проблемой также с другим пакетом npm для mssql.

После некоторого следа и ошибки я решил пойти на класс singelton (статический также был бы возможен), который обрабатывает соединение.

Теперь вам нужно просто вызвать одну функцию перед каждым запросом, чтобы создать новый пул соединений или получить текущий.

Что-то вроде этого:

    let _this = {};
    let connectionPool = null;

    function getConnection(){
        if(connectionPool){
            return connectionPool
        } else { 
            connectionPool = new pg.Pool({
                user: 'user',
                host: 'localhost',
                database: 'myProject',
                password: 'secret',
                port: 5432
            });
            return connectionPool;
        }
    }

   function closeConnection(){
       // close connection here       
   }

    _this.getConnection = getConnection;
    _this.closeConnection = closeConnection;

   module.exports = _this;
Другие вопросы по тегам