用node-postgres监听查询超时?

我有一个Postgresql 9.1数据库上的“文章”表和一个通知每个插入通道的触发器。

我想创build一个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: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以外的其他模块提供更合适的工具来做到这一点?

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

pg.connect用于创build池连接。 使用连接池连接监听事件确实不被支持,或者一个好主意。 […]按照定义“听”连接必须永久保持开放。 要使连接永久保持打开状态,永远不会将其返回到连接池。

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

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

LISTEN应该持续UNLISTEN时间,或者直到你做UNLISTEN 。 所以,只要你的代码正在运行,通知应该被传递。 请注意,IIRC,postgresql没有承诺每个NOTIFY发送一个通知 – 如果您有多个插入,它可能会select传递一个NOTIFY 。 不确定9.1,他们引入了LISTEN有效载荷,所以它可能会有点不太合理。