gpt4 book ai didi

node.js - 何时断开连接以及何时结束 pg 客户端或池

转载 作者:IT老高 更新时间:2023-10-28 22:06:58 26 4
gpt4 key购买 nike

我的堆栈是 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 documentation *:

const { Pool } = require('pg')

const pool = new Pool()

// the pool with emit an error on behalf of any idle clients
// it contains if a backend error or network partition happens
pool.on('error', (err, client) => {
console.error('Unexpected error on idle client', err) // your callback here
process.exit(-1)
})

// promise - checkout a client
pool.connect()
.then(client => {
return client.query('SELECT * FROM users WHERE id = $1', [1]) // your query string here
.then(res => {
client.release()
console.log(res.rows[0]) // your callback here
})
.catch(e => {
client.release()
console.log(err.stack) // your callback here
})
})

此代码/构造足够/使您的池工作,提供您的东西在这里的东西。如果您关闭应用程序,连接将正常挂起,因为池创建得很好,完全不会挂起,即使它确实提供了手动挂起方式,见 article 的最后一节.另请查看前面的红色部分,上面写着“您必须始终返回客户......”以接受

  • 强制 client.release() 指令
  • 在访问参数之前。
  • 您在回调中的范围/关闭客户端。

那么,来自pg.client documentation *:

带有 promise 的纯文本查询

const { Client } = require('pg').Client
const client = new Client()
client.connect()
client.query('SELECT NOW()') // your query string here
.then(result => console.log(result)) // your callback here
.catch(e => console.error(e.stack)) // your callback here
.then(() => client.end())

在我看来是最清晰的语法:

  • 无论结果如何,你都会结束客户端。
  • 您在结束客户端之前访问结果。
  • 您不会在回调中限定/关闭客户端

这两种语法之间的这种对立乍一看可能会让人感到困惑,但其中并没有什么神奇之处,它是实现构造语法。专注于您的回调和查询,而不是那些构造,只需挑选最适合您的眼睛并用您的代码提供它。

*为了清楚起见,我在此处添加了评论 //你的 xxx

关于node.js - 何时断开连接以及何时结束 pg 客户端或池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50497583/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com