Как использовать node -postgres на сервере?

Я пишу веб-сервер Node.js, который использует базу данных Postgres. Я использовал для каждого нового запроса следующее:

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 и вернув его.)

Итак, как мне сделать это?

  • Правильно соединяйте соединения Postgres, чтобы я мог "повторно подключаться" каждый раз, не исчерпывая память.
  • Глобальный клиент автоматически подключается после сбоя сети.

Ответ 1

Я предполагаю, что вы используете последнюю версию node -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.