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;
}
我有一个用例,许多数据库连接是使用 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;
}