как отключить пул в модуле pg - PullRequest
0 голосов
/ 22 мая 2018

Итак, я использую модуль 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()

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

Я наконец сделал свой код как pooling ,Он показывает функцию 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 Ответ

0 голосов
/ 22 мая 2018

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

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

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

Примерно так:

    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;
...