我指定了一个在向表中插入行后执行的函数。该函数使用 pg_notify 函数通过新行的 JSON 负载通知 channel jobqueue。
job_notifier
函数:
CREATE FUNCTION job_notifier() RETURNS TRIGGER AS $$
BEGIN
PERFORM pg_notify('jobqueue', row_to_json(NEW)::text);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
这是触发器:CREATE TRIGGER job_created AFTER INSERT ON jobs EXECUTE FUNCTION job_notifier();
jobs
表由几列组成。
我正在使用node-postgres用于访问数据库的库。我用这个库创建的一个 JS 客户端收到了消息,所以我知道该函数会在正确的时刻触发。
但是有效负载是空字符串。当我将 row_to_json(NEW)::text
替换为 'abcd'
这样的简单字符串时,我得到了此有效负载,因此由于某种原因,转换为 JSON 对象失败。
我不确定这是否是我的数据库功能的问题,但我怀疑这可能是 Javascript 库的问题。
有人使用node-postgres
进行这种设置吗?数据库在 docker 容器内运行(来自 Dockerhub 的官方 postgres
图像),也许我可以启用某种日志记录来查看数据库中是否正在生成有效负载?
最佳答案
触发器的默认设置是为每个语句触发一次,其中 NEW 设置为 NULL,从而导致没有有效负载。如果您希望触发器在填充 NEW 的情况下为每行触发一次,则必须指定它。
CREATE TRIGGER job_created AFTER INSERT ON jobs FOR EACH ROW
EXECUTE FUNCTION job_notifier();
关于javascript - Postgres : No payload received when using pg_notify with `node-postgres` Javascript library,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60496389/