2017-08-01 34 views
0

我想在PostgreSQL中設置一個簡單的LISTEN/NOTIFY功能並使用pg-promise庫通知node.js代碼。Postgres LISTEN/NOTIFY與pg-promise

我已經腳手架的PG代碼

CREATE OR REPLACE FUNCTION notify_trigger() RETURNS trigger AS $$ 
DECLARE 
BEGIN 
    RAISE NOTICE '%', 'HI'; 
    PERFORM pg_notify('watchers', TG_TABLE_NAME || ', tags:,' || NEW.tags); 
    RETURN new; 
END; 
$$ LANGUAGE plpgsql; 

CREATE TRIGGER watched_table_trigger BEFORE INSERT OR UPDATE ON assets 
FOR EACH ROW EXECUTE PROCEDURE notify_trigger(); 

它的psql控制檯上的通知。

但是,當我使用pg-promise代碼時,它不輸出控制檯消息,因爲我希望。相關的Node.js代碼:

const pgoptions = require('./pgoptions.config.js'); 
const connectObject = require('./pgconnect.config.js'); 
const db = require('pg-promise')(pgoptions)(connectObject); 

// added listener code for pg listen/notify 
db.connect({direct: true}) 
    .then(function (sco) { 
     sco.client.on('assets', function (data) { 
      console.log('Received: ', data); 
    }); 
    return sco.none('LISTEN assets'); 
}) 
.catch(function (error) { 
    console.error('Error:', error); 
}); 

module.exports = resources; 

的代碼的NodeJS直出pg-promiseLearn By Example文檔here的。我沒有回顧關於此主題的其他帖子,但沒有找到基於pg-promise的解決方案。

回答

0

它不是

sco.client.on('assets', function (data) { 

它是

sco.client.on('notification', function (data) { 

即你正在訂閱通用notification消息,而不是信道名稱。這就是你所引用的the very example

+0

我做了這個改變,仍然沒有收到通知。還有什麼我應該找的? –

+0

@PiyushMehta看起來你正在通過'watchers'頻道進行募捐,而在頻道'assets'上發佈'LISTEN'來代替。 –

+0

謝謝,這是做到了。 –