2011-11-24 57 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和整個環境會發生什麼...... –