СЛУШАТЬ время ожидания запроса с node-postgres? - PullRequest
7 голосов
/ 25 ноября 2011

У меня есть таблица "article" в базе данных Postgresql 9.1 и триггер, который уведомляет канал при каждой вставке.

Я хотел бы создать скрипт node.js, который перехватывает эти вставки и отправляет уведомления подключенным клиентам с помощью Socket.io. Пока что я использую модуль node-postgres, чтобы LISTEN каналу, но кажется, что запрос LISTEN останавливается примерно через 10-15 секунд и перестает перехватывать вставки. Я могу запросить новое прослушивание, когда истечет время ожидания, но я не уверен, как правильно реализовать продолжение.

Вот моя процедура уведомления postgresql:

CREATE FUNCTION article_insert_notify() RETURNS trigger AS $$
BEGIN
  NOTIFY "article_watcher";
  RETURN NULL;
END;
$$ LANGUAGE plpgsql;

Триггер:

CREATE TRIGGER article_insert_trigger
AFTER INSERT ON article
FOR EACH ROW EXECUTE PROCEDURE article_insert_notify();

И код node.js:

var pg = require ('pg'),
    pgConnection = "postgres://user:pass@localhost/db"

pg.connect(pgConnection, function(err, client) {
    client.query('LISTEN "article_watcher"');
    client.on('notification', function(data) {
        console.log(data.payload);
    });
});

Как я могу обеспечить LISTEN на полный рабочий день или как я могу перехватить эти тайм-ауты для повторного запроса на прослушивание? Или, может быть, модуль, отличный от node-postgres, предлагает для этого более подходящие инструменты?

Ответы [ 2 ]

8 голосов
/ 26 ноября 2011

Я получил ответ на мою проблему в репозитории node-postgres. Цитировать Брианка:

pg.connect используется для создания пул соединений. Использование соединения подключение к пулу для прослушивания событий действительно не поддерживается или является хорошим Идея, хотя. [...] Для «прослушивания» соединение по определению должно оставаться открытым постоянно. За соединение, которое остается открытым постоянно, никогда не может быть возвращено пул соединений.

Правильный способ прослушивания в этом случае - использовать автономный клиент:

var pg = require ('pg'),
    pgConnectionString = "postgres://user:pass@localhost/db";

var client = new pg.Client(pgConnectionString);
client.connect();
client.query('LISTEN "article_watcher"');
client.on('notification', function(data) {
    console.log(data.payload);
});
0 голосов
/ 25 ноября 2011

LISTEN должен длиться в течение времени жизни сеанса или до тех пор, пока вы не выполните UNLISTEN. Таким образом, пока ваш код работает, уведомления должны доставляться. Обратите внимание, что IIRC, postgresql, не дает обещаний доставить одно уведомление за NOTIFY - если у вас много вставок, он может выбрать доставку одного NOTIFY. Не уверен насчет 9.1, они представили LISTEN полезную нагрузку, так что это может иметь немного меньше смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...