3

我需要一些关于 pg npm 的帮助。

我已经阅读了许多文章和示例,并且对以正确的方式使用 pg 池完全感到困惑。我读过的许多文章都是旧的。

我想向您展示我的一些代码以及我如何围绕 db 构建所有内容。我很少担心需要您的支持。

这就是我实施的方式:

我只在服务器启动时与 Postgres 建立一次连接。

let pg = require('pg')

const db_config = {
    user : DB_USER,
    password : DB_PWD,
    database : DB_NAME,
    host : DB_HOST,
    max : 5, // max number of clients in the pool
    connectionTimeoutMillis : 5000,
    idleTimeoutMillis : 30000
};

conn = new pg.Pool(db_config);

conn.connect((err, client, done) => {
    if (err) {
        log.error(err.message);
        log.error(`could not connect to database`);
    } else {
        conn.query('SELECT 1', (err, res) => {
            done();
            if (err) {
                log.error(err)
            } else {
                log.info("connected to database");
            }
        });
    }
});

请注意conn对象是全局的,我在程序中的每个地方都使用它。

然后我启动我的 HTTP 服务器。到达服务器的每个请求平均必须运行大约 25 个数据库查询。在程序的生命周期中,我使用相同的 conn 对象来触发查询,如下所示。代码中的每个函数仅包含以下用于查询的代码。

conn.query(query, function (err, docs) {    
    if (err) {
        log.error(err);
    } else {
        // do something 
    }
});

我正在使用“pg”:“^6.2.2”

——————————————————</p>

我的担忧:

  1. 我在使用游泳池吗?

  2. 如何正确利用池?

  3. 每次在代码中执行任何查询之前,我是否需要连接到 pg ,这意味着 conn.connect ?

  4. 如果无法访问数据库,代码在读取时挂起,然后在很长一段时间后超时,我该如何处理?有什么办法可以让我在想要的时间之后超时?

4

1 回答 1

1

我知道这是一个老问题,对于pg 6.2.2,但我会回答pg 7+ (很容易更新),因为我也面临同样的问题并且不知所措。

下面是我如何使用您的代码将其设置为使用池。足够聪明,可以立即或稍后再次使用pg时知道池已经存在。conn.connect()我将逻辑包装在一个可以轻松重用的查询函数中。现在它不会在出现错误时挂起,但在发生错误时可能会返回意外数据,因此请注意这一点。

let pg = require('pg')

const db_config = {
  user : DB_USER,
  password : DB_PWD,
  database : DB_NAME,
  host : DB_HOST,
  max : 5, // max number of clients in the pool
  connectionTimeoutMillis : 5000,
  idleTimeoutMillis : 30000
};

const conn = new pg.Pool(db_config);

function query(sql, cb) {
  conn.connect((err, client, done) => {
    if (err) {
      log.error(err.message);
      log.error(`could not connect to database`);
      cb(err);
      done();
    }
    else {
      client.query(sql, (err, res) => {
        cb(res);
        done();
        if (err) {
          log.error(err)
        }
        else {
          log.info("connected to database");
        }
      });
    }
  });
}

然后运行查询,只需执行以下操作:

// run a query
query("SELECT 1", function(result) {
  console.log(result);
});
于 2018-07-10T23:15:03.547 回答