В чем разница между pool.query и client.query с библиотекой Node pg? - PullRequest
0 голосов
/ 29 мая 2019

Я пытаюсь понять pool.query и client.query и различия между ними и когда использовать.

У меня есть экспресс-приложение, которое запускает следующий код в определенной конечной точке.

// 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
  pool // *** here ***
    .query(
      ` SELECT username, email, password FROM users 
        WHERE users.username = $1
        AND users.password = crypt($2, password)
      `, [username, password]
    )
    .then(user => {
      console.log("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.log(err));
});

// 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.log("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.log(err));
});
// index.js (starting point of application)
require("dotenv").config({ debug: true });
const app = require("./middleware");


// Port Listener
app.listen(process.env.PORT, () =>
  console.log(
    "Server running on PORT <======= " + process.env.PORT + " =======>"
  )
);

Я нажал на конечные точки API, и оба способа возвращают один и тот же результат, и я прочитал, что лучше использовать пул, а не создание экземпляра нового клиента, но я честно не уверен, верно ли это, поскольку Node должен сохранять тот же экземпляр клиента из-за способа его экспорта, поскольку он находится за пределами моей текущей базы знаний. Чтения, которые я нашел по этой теме, были довольно редкими, поэтому, если у кого-нибудь есть какие-либо статьи, которые они порекомендуют, то я также буду рад их проверить.

1 Ответ

1 голос
/ 29 мая 2019

Я считаю, что оба одинаковы. Но 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.log(result.rows)
  })
})

То же, что и выше, но без пула

const { Client } = require('pg').Client
const client = new Client()
client.connect()
client.query('SELECT NOW()', (err, res) => {
  if (err) throw err
  console.log(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.log(result.rows[0].name) // brianc
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...