Невозможно освободить клиент postgres с помощью npm-postgres - PullRequest
0 голосов
/ 24 января 2019

Вот код, который я пробовал.client.release () или client.end () давая мне UnhandledPromiseRejectionWarning . Я хотел бы выпустить соединение обратно в пул или его завершение после вставки данных.

client.query(format(query, values), (err, res) => {
          if (err) {
            console.error(err, res);
            client.release();
          } else {
            console.log('POSTGRES DATA INSERTED SUCCESSFULLY');
            //  client.end();
            client.release();
          }
        });

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

// Это сработало для меня

const connectionString = 'postgresql://postgres:postgres@localhost:5432/tpa';

const pool = new Pool({
  connectionString,
  max: 20,
  idleTimeoutMillis: 30000,
  connectionTimeoutMillis: 10000
});

 pool.connect((err, client, release) => {
          if (err) {
            return console.error('Error acquiring client', err.stack);
          }
          client.query(format(query, values), (err, res) => {
            if (err) {
              console.error(err, res);
              release();
            } else {
              console.log('POSTGRES QUERY EXECUTED SUCCESSFULLY');
              release();
            }
          });
0 голосов
/ 31 января 2019

Ваш код смешивает стили программирования. client.release() - это то, что вы используете, когда вы хотите использовать API с Promises, client.query(query, callback) - это то, что вы используете, когда вы хотите использовать API обратного вызова. Это не очень хорошая идея смешивать два.

Если вы хотите использовать стиль обратного вызова, то вы должны использовать стиль обратного вызова с pool.connect и вызывать параметр release, который передается вашему обратному вызову:

pool.connect((err, client, release) => {
  // if err, report it.
  client.query('SELECT NOW()', (err, result) => {
    // if err, report it.
    // do stuff, and then release the client
    release() // <--- call the 3rd argument passed to your callback
  })
})

Если вы хотите использовать Promise API, вы должны переписать свой код следующим образом:

  const client = await pool.connect();

  let res;
  try {
    res = await client.query("some query");
  }
  finally {
    await client.release();
  }

  // do something with res

Важно то, что этот код обрабатывает обещание, выдаваемое client.release(), поэтому в случае неудачи вы не получите UnhandledPromiseRejectionWarning. Узел выведет ошибку на консоль и предоставит трассировку стека.

...