node.js - 如何断开 pg 模块中的池

标签 node.js postgresql node-postgres node-pg-pool

所以,我使用 pg module在 Node 8.11.1/express 4.16.3/pg 7.4.2

我尝试将池用于我的前端(仅选择),示例有些困惑。

connecting它只使用一个新的 Pool 然后它表明我必须做 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()

queries示例中没有断开连接(?)

我终于把我的代码写成了 pooling .它显示了 pool.on('error', (err, client) => { 函数,然后它在池中使用了 client.release(),因为“pool .query 在内部直接委托(delegate)给 client.query”我猜?

那么,在 pg 中使用 pool 的正确方法是什么?每次查询或失败后如何断开连接?我想到了这个

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', (错误,客户端)=> {...

此外,如果它像

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 结束。

请就正确的池用法和语法提出建议

谢谢

最佳答案

我在使用另一个用于 mssql 的 npm 包时也遇到了这种问题。

经过一些试验和错误后,我决定选择一个处理连接的 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;

关于node.js - 如何断开 pg 模块中的池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50469073/

相关文章:

node.js - 如何使用nodemailer在Node.js中将base64字符串作为图像发送?

node.js - 找不到模块正在错误的目录中查找

postgresql - 如何在数据库外使用斜杠命令?

postgresql - 为什么我的 PostgreSQL 随机数右填充零?

node.js - Multi-Tenancy Web应用程序: no verified domain

node.js - 无法使用 UpdateItem 从列表中删除元素

sql - 在 postgres 中有效地标记行的连续子集

node.js - Node-postgres 连接到本地主机而不是 AWS Postgres 实例

javascript - Node-Postgres 查询方法不调用其回调函数

node.js - 如何检查表是否存在?