Мой стек - узел, экспресс и модуль 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();
от обеих функций он будет работать.
Я смущен, поэтому, пожалуйста, совет о том, как и когда отключить и полностью закрыть пул или клиента. Любые подсказки, объяснения или руководства будут оценены.
Спасибо