所以,我使用 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/