How do I use node-postgres in a server?

烂漫一生 提交于 2020-01-12 13:58:06

问题


I'm writing a Node.js web server that uses a Postgres database. I used to connect on each new request like this:

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

But after a few requests, I noticed 'out of memory' errors on Heroku when trying to connect. My database has only 10 rows, so I don't see how this could be happening. All of my database access is of this form:

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) }));
});

Assuming that the memory error was due to having several persistent connections to the database, I switched to a style I saw in several node-postgres examples of connecting only once at the top of the file:

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

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

But now my requests hang (indefinitely?) when I try to execute a query after the connection is disrupted. (I simulated it by killing a Postgres server and bringing it back up.)

So how do I do one of these?

  1. Properly pool Postgres connections so that I can 'reconnect' every time without running out of memory.
  2. Have the global client automatically reconnect after a network failure.

回答1:


I'm assuming you're using the latest version of node-postgres, in which the connection pooling has been greatly improved. You must now check the connection back into the pool, or you'll bleed the connections:

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

As for error handling on a global connection (#2, but I'd use the pool):

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

The "missing" docs for all this is on the GitHub wiki.



来源:https://stackoverflow.com/questions/15619456/how-do-i-use-node-postgres-in-a-server

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!