如何使用节点的Postgres的服务器?(How do I use node-postgres in

2019-08-18 00:19发布

我正在写一个使用Postgres数据库一个Node.js的web服务器。 我曾经在这样一个新请求连接:

app.get('/', function (req, res) {
  pg.connect(pgconnstring, function (err, client) {
    // ...
  });
});

但也有少数的请求后,我发现“超出内存”在Heroku尝试连接时出错。 我的数据库只有10行,所以我看不出这可能发生。 我所有的数据库访问是这样的形式:

client.query('SELECT * FROM table', function (err, result) {
  if (err) {
    res.send(500, 'database error');
    return;
  }

  res.set('Content-Type', 'application/json');
  res.send(JSON.stringify({ data: result.rows.map(makeJSON) }));
});

假设内存错误是由于其在数据库中的几个持续连接,我切换到风格我看到几个node-postgres在文件的顶部连接只有一次的例子:

var client = new pg.Client(pgconnstring);
client.connect();

app.get('/', function (req, res) {
  // ...
});

但现在我的请求挂起(无限期?)当我尝试连接中断后执行查询。 (我通过杀死一个Postgres服务器,并把它备份模拟它。)

所以,我该怎么做这些吗?

  1. 适当集中Postgres连接,这样我可以“重新连接”不会耗尽内存每次。
  2. 拥有全球客户网络故障后自动重新连接。

Answer 1:

我假设你正在使用最新版本的节点的Postgres,其中连接池有了很大的提高。 现在,您必须检查连接放回池中,否则你会流血的连接:

app.get('/', function (req, res) {
  pg.connect(pgconnstring, function (err, client, done) {
    // do some stuff
    done();
  });
});

作为处理在全球连接错误(#2,但我会用池):

client.on('error', function(e){
  client.connect(); // would check the error, etc in a production app
});

这一切的“失踪”文档是在GitHub的维基 。



文章来源: How do I use node-postgres in a server?