【发布时间】:2018-11-02 23:41:21
【问题描述】:
我的堆栈是 node、express 和 pg 模块。我真的试图通过文档和一些过时的教程来理解。 我不知道何时以及如何断开和结束客户端。
对于某些路线,我决定使用游泳池。这是我的代码
const pool = new pg.Pool({
user: 'pooluser',host: 'localhost',database: 'mydb',password: 'pooluser',port: 5432});
pool.on('error', (err, client) => {
console.log('error ', err); process.exit(-1);
});
app.get('/', (req, res)=>{
pool.connect()
.then(client => {
return client.query('select ....')
.then(resolved => {
client.release();
console.log(resolved.rows);
})
.catch(e => {
client.release();
console.log('error', e);
})
pool.end();
})
});
在 CMS 的路由中,我使用客户端而不是具有与池不同的 db 权限的池。
const client = new pg.Client({
user: 'clientuser',host: 'localhost',database: 'mydb',password: 'clientuser',port: 5432});
client.connect();
const signup = (user) => {
return new Promise((resolved, rejeted)=>{
getUser(user.email)
.then(getUserRes => {
if (!getUserRes) {
return resolved(false);
}
client.query('insert into user(username, password) values ($1,$2)',[user.username,user.password])
.then(queryRes => {
client.end();
resolved(true);
})
.catch(queryError => {
client.end();
rejeted('username already used');
});
})
.catch(getUserError => {
return rejeted('error');
});
})
};
const getUser = (username) => {
return new Promise((resolved, rejeted)=>{
client.query('select username from user WHERE username= $1',[username])
.then(res => {
client.end();
if (res.rows.length == 0) {
return resolved(true);
}
resolved(false);
})
.catch(e => {
client.end();
console.error('error ', e);
});
})
}
在这种情况下,如果我收到 username already used 并尝试使用另一个用户名重新发布,getUser 的查询永远不会启动并且页面会挂起。如果我从这两个函数中删除client.end();,它将起作用。
我很困惑,所以请就如何以及何时断开连接以及完全结束池或客户端提供建议。任何提示或解释或教程将不胜感激。
谢谢
【问题讨论】:
-
之前的解决方案有帮助吗?
-
如果您使用自动管理连接的pg-promise,您就不会遇到这个问题。当您尝试像这样在低级别管理连接时,您最终可能会做错事、泄漏连接和/或损害应用程序。
-
@vitaly-t 你是 pg-promise 的创造者,对吧?只是几个问题。它在后台使用什么,客户端或池?或者没关系,因为这是内部解决的?另外,我可以在同一个应用程序中有多个 pg-promises,每个都连接到同一个数据库,使用不同的配置对象吗? (那些配置对象,每个都有不同的用户,拥有不同的数据库权限。)谢谢
-
@vitaly-t 酷。另外,我猜当使用事务时,pg-promise 使用 Clients 在后台处理它? (因为 pg 确实强调了在使用事务时,您必须使用客户端)。实际上 pg-promise 看起来很简单,我将对其进行测试,因为与我处理 pg 连接和客户端/池的尝试相比,它是高级别的。谢谢
标签: node.js postgresql node-postgres