pg-promise:使用新密码更新现有连接

pg-promise: Update existing connection with new password

我有一个用例,许多数据库连接是使用 pg-promise 动态创建的。有时我需要再次连接到相同的数据库和用户,但密码已更改。

有没有一种方法可以更新现有连接,这样我就不会收到“警告:为同一连接创建重复的数据库对象。”?

编辑以获得更好的解释:

上下文 我有一个非传统应用程序,它是一个节点服务,使用 Postgres + PostGIS 在软件 QGIS 中处理地理空间数据采集。

此应用程序在 PostgreSQL 服务器中创建临时用户,并根据用户需要执行的工作类型管理表和列的权限。

代码

    const dbs = {} //global variable that stores all connections
    
    const getConnection = async (user, password, server, port, dbname) => {
      const connString = `postgres://${user}:${password}@${server}:${port}/${dbname}`
      if (connString in dbs) {
        return dbs[connString]  //if connection already exists returns the connection
      }
    
      dbs[connString] = db.pgp(connString) //create new connection
      await dbs[connString] //tests if connections is correct
        .connect()
        .then(obj => {
          obj.done() // success, release connection;
        })
        .catch(e => {
          errorHandler.critical(e)
        })
    
      return dbs[connString]
    }

我想要的是添加另一种情况,如果连接已经存在但密码已更改,它将更新现有的连接密码(或销毁它并创建一个新密码)。

您遇到的问题是您将密码用作连接字符串密钥的一部分,该密钥未在库的唯一连接检查中使用,因此会产生副作用。

对于密钥,您需要使用不包含密码的唯一连接字符串。并且在发出请求时,您需要更新连接详细信息。

下面的示例使用了连接对象,而不是连接字符串,因为这样更简单。但如果你愿意,你也可以使用连接字符串,你只需要生成一个单独的连接字符串,使用密码,并更新 $pool.options.connectionString,而不是 $pool.options.password.

const dbs = {}; // global variable that stores all connections

const getConnection = async (user, password, host, port, database) => {
    const key = `${user}@${host}:${port}/${database}`; // unique connection key
    const cn = { host, port, database, user, password }; // actual connection
    let db; // resulting database object

    if (key in dbs) {
        db = dbs[key];
        db.$pool.options.password = password; // updating the password
    } else {
        db = pgp(cn); // creating new connection
        dbs[key] = db;

        await db // test if can connect
            .connect()
            .then(obj => {
               obj.done(); // success, release connection;
            })
            .catch(e => {
               errorHandler.critical(e);
               throw e;
            })
    }
   
    return db;
}