使用node-postgres进行LISTEN查询超时?

时间:2011-11-24 20:53:16

标签: postgresql node.js asynchronous

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

如何确保全时收听?或者如何捕获这些超时以重新发出监听查询?或者,node-postgres以外的模块可能会提供更合适的工具吗?

2 个答案:

答案 0 :(得分:8)

我在node-postgres repo上得到了我的问题的答案。引用Brianc:

  

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

答案 1 :(得分:0)

LISTEN应该持续会话有效期或直到UNLISTEN为止。因此,只要您的代码正在运行,就应该发送通知。注意,IIRC,postgresql没有承诺每NOTIFY发送一个通知 - 如果你有很多插入,它可能会选择提供一个NOTIFY。不确定9.1,他们引入了LISTEN有效载荷,所以它可能没有多大意义。