这是我试过的代码.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();
}
});
您的代码混合了编程风格。当您想要将API与Promises一起使用时,使用client.release()
,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会将错误转储到控制台并提供堆栈跟踪。
//这对我有用
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();
}
});