无法使用npm-postgres发布postgres客户端

时间:2019-01-24 07:50:30

标签: node.js postgresql node-postgres

这是我尝试过的代码。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 :(得分:0)

您的代码混合了编程样式。 client.release()是要与Promises一起使用API​​的方式,client.query(query, callback)是要与回调API一起使用的方式。混合使用这不是一个好主意。

如果要使用回调样式,则也应该使用callback style with 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。 Node会将错误转储到控制台并提供堆栈跟踪。

答案 1 :(得分:-1)

//这对我有用

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();
            }
          });