ASCOLTA il timeout della query con node-postgres?

Ho una tabella “article” su un database Postgresql 9.1 e un trigger che notifica un canale su ciascun inserto.

Mi piacerebbe creare uno script node.js che catturi quegli inserti e spinga le notifiche ai client connessi usando Socket.io. Finora sto usando il modulo node-postgres su LISTEN per il canale ma sembra che la query LISTEN scade dopo circa 10-15 secondi e smette di catturare gli inserti. Potrei richiedere un nuovo ascolto quando si verifica il timeout, ma non sono sicuro di come implementare correttamente la continuazione.

Ecco la mia procedura di notifica postgresql:

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

Il grilletto:

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

E il codice 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); }); }); 

Come posso garantire un LISTEN a tempo pieno o come posso catturare questi timeout per riemettere una query di ascolto? O forse un modulo diverso da node-postgres offre strumenti più appropriati per farlo?

Ho ricevuto risposta al mio problema sul repository node-postgres. Per citare Brianc:

pg.connect viene utilizzato per creare connessioni in pool. L’utilizzo di una connessione del pool di connessione per gli eventi di ascolto non è supportato o comunque una buona idea. […] Per “ascoltare” una connessione per definizione deve rimanere aperta in modo permanente. Affinché una connessione rimanga aperta in modo permanente, non può mai essere restituita al pool di connessioni.

Il modo corretto di ascoltare in questo caso è quello di utilizzare un client standalone:

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

LISTEN dovrebbe durare per la durata della sessione o fino a quando non si esegue UNLISTEN . Quindi, finché il codice è in esecuzione, le notifiche dovrebbero essere consegnate. Nota, che IIRC, postgresql non dà alcuna promise di consegnare una notifica per NOTIFY – se hai molti inserti potrebbe scegliere di consegnare un singolo NOTIFY . Non sono sicuro di 9.1, hanno introdotto il payload LISTEN , quindi potrebbe essere un po ‘meno sensato.