我需要一些关于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"
------------------
我的担忧:
我是否使用游泳池?
如何正确使用游泳池?
每次在代码中执行任何查询之前,是否需要连接到pg,这意味着conn.connect?
如果无法访问数据库,代码会在读取时挂起,然后在很长时间后超时,如何处理?有什么办法可以在理想的时间后抽出时间吗?
答案 0 :(得分:0)
我知道这是一个古老的问题,并且是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);
}