¿Cómo uso node-postgres en un servidor?

Estoy escribiendo un servidor web Node.js que usa una base de datos de Postgres. Solía ​​conectarme en cada nueva solicitud de esta manera:

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

Pero después de algunas solicitudes, noté errores “sin memoria” en Heroku al intentar conectar. Mi base de datos solo tiene 10 filas, por lo que no veo cómo podría estar sucediendo esto. Todo mi acceso a la base de datos es de esta forma:

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

Suponiendo que el error de memoria se debió a tener varias conexiones persistentes a la base de datos, cambié a un estilo que vi en varios ejemplos de node-postgres de conexión solo una vez en la parte superior del archivo:

 var client = new pg.Client(pgconnstring); client.connect(); app.get('/', function (req, res) { // ... }); 

Pero ahora mis solicitudes se cuelgan (¿de forma indefinida?) Cuando bash ejecutar una consulta después de que se interrumpe la conexión. (Lo simulé matando un servidor de Postgres y volviendo a ponerlo en marcha).

Entonces, ¿cómo hago uno de estos?

  1. Agrupe adecuadamente las conexiones de Postgres para que pueda ‘reconectarme’ cada vez que me quede sin memoria.
  2. Haga que el cliente global vuelva a conectarse automáticamente después de una falla de la red.

Supongo que está utilizando la última versión de node-postgres, en la que la agrupación de conexiones se ha mejorado considerablemente. Ahora debes verificar la conexión de nuevo en el grupo, o sangrarás las conexiones:

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

En cuanto al manejo de errores en una conexión global (# 2, pero usaría el grupo):

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

Los documentos “faltantes” para todo esto están en la wiki de GitHub .