带有 pg-promise 的 Postgres LISTEN / NOTIFY
Postgres LISTEN / NOTIFY with pg-promise
我正在尝试在 PostgreSQL 中设置一个简单的 LISTEN/NOTIFY
功能并使用 pg-promise 库通知 node.js 代码。
我搭建的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-promise 的 通过示例学习 文档 此处。我确实查看了有关此主题的其他帖子,但没有找到基于 pg-promise 的解决方案。
不是
sco.client.on('assets', function (data) {
是
sco.client.on('notification', function (data) {
即您订阅的是通用 notification
消息,而不是频道名称。这就是你引用的 the very example 的显示方式。
我正在尝试在 PostgreSQL 中设置一个简单的 LISTEN/NOTIFY
功能并使用 pg-promise 库通知 node.js 代码。
我搭建的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-promise 的 通过示例学习 文档 此处。我确实查看了有关此主题的其他帖子,但没有找到基于 pg-promise 的解决方案。
不是
sco.client.on('assets', function (data) {
是
sco.client.on('notification', function (data) {
即您订阅的是通用 notification
消息,而不是频道名称。这就是你引用的 the very example 的显示方式。