2011-11-24 59 views
6

我有一个Postgresql 9.1数据库上的“文章”表和一个通知每个插入通道的触发器。使用node-postgres监听查询超时?

我想创建一个node.js脚本来捕获这些插入,并使用Socket.io将通知推送到连接的客户端。到目前为止,我使用node-postgres模块来侦听频道,但似乎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:[email protected]/db" 

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

如何确保一个全职LISTEN或如何我能否抓住这些超时时间来重新发出听取查询?或者,也许node-postgres以外的其他模块可以提供更合适的工具来实现这一点?

+0

使用[PG-承诺(https://github.com/vitaly-t/pg-promise) ,完整的例子与解释:[LISTEN/NOTIFY](https://github.com/vitaly-t/pg-promise/wiki/Learn-by-Example#listen--notify) –

回答

8

我得到了关于node-postgres回购的问题的答案。引用Brianc:

pg.connect用于创建池连接。尽管如此,使用连接 侦听事件的连接池确实不受支持,或者是一个好的 想法。 [...] 按照定义“监听”连接必须永久保持打开状态。对于 连接永久保持打开状态,永远不会返回到连接池 。

在这种情况下,听取正确的方法是使用一个独立的客户端:

var pg = require ('pg'), 
    pgConnectionString = "postgres://user:[email protected]/db"; 

var client = new pg.Client(pgConnectionString); 
client.connect(); 
client.query('LISTEN "article_watcher"'); 
client.on('notification', function(data) { 
    console.log(data.payload); 
}); 
0

LISTEN应该持续会话的生命周期或直到您做UNLISTEN。所以,只要你的代码正在运行,通知就应该交付。请注意,IIRC,postgresql不承诺每NOTIFY提供一个通知 - 如果您有多个插入,它可能会选择提供一个NOTIFY。不确定9.1,他们介绍了LISTEN有效载荷,所以它可能会有点不太合理。

+0

然后,15秒超时是一个客户端问题?我可以使用node-postgres来解决这个问题,还是我没有为我想做的事情做好准备? – lheurt

+0

我不是很了解节点部分,我不确定我完全理解在发布代码后pg和整个环境会发生什么...... –