Node pg 库的 pool.query 和 client.query 有什么区别?

What is the difference between pool.query and client.query with the Node pg library?

我正在尝试了解 pool.queryclient.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 = 
        AND users.password = crypt(, 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 端点并且两种方式 return 完全相同的结果,我已经读到使用池化而不是实例化一个新的客户端实例更好,但老实说我不是确定这是否属实,因为 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.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 ::text as name', ['brianc'], (err, result) => {
  if (err) {
    return console.error('Error executing query', err.stack)
  }
  console.log(result.rows[0].name) // brianc
})