javascript - Postgres : No payload received when using pg_notify with `node-postgres` Javascript library

标签 javascript postgresql database-trigger node-postgres pg-notify

我指定了一个在向表中插入行后执行的函数。该函数使用 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/

相关文章:

JavaScript 无法读取 null 的属性 'value'

python - Psycopg2 SSL Anaconda 支持未编译

php - 查询之间 [PostgreSQL & PHP]

mysql - 有人可以帮我理解如何在 dbms 中编写触发器吗?

mysql - 如何在mysql触发器中将点(.)连接到像pic.jpeg这样的字符串?

javascript - "Style"是 javascript 中的保留字吗?

javascript - AngularJS ng-show 与 map 一起使用时不会触发

javascript - parseInt 返回 NaN

sql - 从 PostgreSQL 中的子查询更新或插入(多行和多列)

mysql - 是否可以有多个触发器具有相同的触发事件和 Action 时间(之前/之后)