Я пытаюсь понять pool.query
и client.query
, а также разницу между ними и когда что использовать.
У меня есть экспресс-приложение, которое запускает следующий код в определенной конечной точке.
// I am just using params for to a quick setup
router.get("/:username/:password", (req, res) => {
const { username, password } = req.params;
// crypt & gen_salt function from pgcrypto
client // *** here ***
.query(
` SELECT username, email, password FROM users
WHERE users.username = $1
AND users.password = crypt($2, password)
`, [username, password]
)
.then(user => {
console.info("Users ==>", user.rows);
const userCount = user.rows.length;
if (userCount < 1) {
res.status(204).json({ userFound: "No User Found" });
} else {
res.status(200).json(user.rows[0]);
}
})
.catch(err => console.info(err));
});
// index.js (starting point of application)
require("dotenv").config({ debug: true });
const app = require("./middleware");
// Port Listener
app.listen(process.env.PORT, () =>
console.info(
"Server running on PORT <======= " + process.env.PORT + " =======>"
)
);
Я нажимаю конечные точки API, и оба способа возвращают один и тот же результат, и я читал, что использование пула вместо создания экземпляра нового клиента лучше, но я, честно говоря, не уверен, что это правда, поскольку Node должен хранить один и тот же экземпляр клиента из-за того, как он экспортируется, поскольку он выходит за рамки моей текущей базы знаний. Книг, которые я нашел по этой теме, было довольно мало, поэтому, если у кого-то есть какие-либо статьи, которые они могли бы порекомендовать, я был бы рад их прочитать.
Я считаю, что оба одинаковы. Но pool.query
позволит вам выполнить базовый одиночный запрос, когда вам нужно выполнить его от клиента, доступ к которому будет осуществляться из пула клиентских потоков.
Таким образом, pool.query
можно использовать для прямого запуска запроса, а не для получения клиента и последующего выполнения запроса с этим клиентом.
Получение клиента из пула
const { Pool } = require('pg')
const pool = new Pool()
pool.connect((err, client, release) => {
if (err) {
return console.error('Error acquiring client', err.stack)
}
client.query('SELECT NOW()', (err, result) => { // Default client query which is same as that used when connect to DB with one client.
release()
if (err) {
return console.error('Error executing query', err.stack)
}
console.info(result.rows)
})
})
То же, что и выше, но без пула
const { Client } = require('pg').Client
const client = new Client()
client.connect()
client.query('SELECT NOW()', (err, res) => {
if (err) throw err
console.info(res)
client.end()
})
Прямой вызов запроса в пуле
const { Pool } = require('pg')
const pool = new Pool()
// Direct query without acquiring client object.
pool.query('SELECT $1::text as name', ['brianc'], (err, result) => {
if (err) {
return console.error('Error executing query', err.stack)
}
console.info(result.rows[0].name) // brianc
})
интересно, а как бы вы объединили пул без настройки клиента здесь узел-postgres.com/guides/асинхронный-экспресс с транзакциями здесь узел-postgres.com/features/transactions