Nodejs Postgresql如何监视新的数据库记录插入

Posted

技术标签:

【中文标题】Nodejs Postgresql如何监视新的数据库记录插入【英文标题】:Nodejs Posgresql how to watch for a new database record insert 【发布时间】:2019-09-06 06:29:25 【问题描述】:

是否可以从我的 Nodejs Express 服务中以某种方式查看我的 Postgresql 数据库并在向数据库中插入新记录时启动一个函数?

NOT:接收插入调用并运行函数。即使有人通过 pgAdmin 之类的方式插入记录,该功能也应该启动。

NOT:在数据库中添加触发器。我需要发送电子邮件等,所以我最好从我的 Nodejs Express 服务中获得解决方案,但我仍然会听取数据库触发的想法。

【问题讨论】:

看看这个包npmjs.com/package/mysql-events @Yidna 你指的是mysql 工具,我需要postgres 的帮助 制作一个触发器,对节点服务器进行 HTTP(甚至是套接字)调用(连接)? 【参考方案1】:

这是一个中等复杂的问题。理想情况下,您有一个供最终用户更改系统状态的 API,并且您可以拦截该 API 中的事件,而不是在数据库层拥有解决方案。这为您提供了最好的抽象和最少的副作用 - “发送电子邮件”是“插入订单值(???)”的副作用。

但是,您的问题很明确 - 您想要跟踪插入。

您有两种选择:拉取与推送。

拉取版本意味着您运行scheduled job,它以您的应用程序要求的任何频率运行,并找到您感兴趣的更改。这可能需要您的数据库中的一个日志表,以便您跟踪更改的数据。例如,如果您正在跟踪“订单”,您可能有一个名为“processed_orders”的表,带有order_id, status, processed_date,然后您按照select * from orders where order_id not in (select order_id from processed_orders 的行运行查询,然后做任何您需要做的事情;完成后,将一行放入processed_orders。

这有几个好处:它是可测试的,可以关闭发送电子邮件的“副作用”,这在您进行批量插入时很方便(例如,在恢复备份之后),您有审计跟踪,并且您可以控制性能影响。缺点是数据库操作和电子邮件发送之间的延迟。如果您有大量计划作业执行类似任务,您可能会注意到性能影响。

我知道的“推送”选项是使用数据库触发器。如果你真的想要,你可以编写一个自定义的trigger in javascript,尽管我建议不要在触发器的上下文中发送电子邮件 - 性能影响可能会很可怕。

您可以使用event streaming 框架,它会根据您的配置设置通知您更改。 Google 是您的朋友。

最后,您可以使用 Postgres 中的pg_notify 功能,该功能使用相当少的触发逻辑来通知监听应用程序更改。

这些选项具有(几乎)即时通知应用程序数据库更改的好处,并且事件流巧妙地将“侦听器”与数据库断开连接。但是,您必须特别注意性能方面,并且您可能需要能够关闭电子邮件发送,例如在进行批量数据操作时。

【讨论】:

【参考方案2】:

PostgreSQL 提供了NOTIFY [1] 和LISTEN [2] 命令来实现这一点。 总的来说,这个想法是让您的 NodeJS 服务侦听来自 PostgreSQL 的 通知

为你找到了这个:https://github.com/andywer/pg-listen - 它可能会让你知道如何在实践中做到这一点。

[1]https://www.postgresql.org/docs/current/sql-notify.html

[2]https://www.postgresql.org/docs/current/sql-listen.html

【讨论】:

以上是关于Nodejs Postgresql如何监视新的数据库记录插入的主要内容,如果未能解决你的问题,请参考以下文章

如何在nodejs + postgresql中实现分页

Nodejs / PostgreSQL sequelize - 如何更新/更改数据库中的模型?

如何以正确的方式将 PostgreSQL 连接到 NodeJS? [复制]

如何通过 nodejs 监视区块链上的比特币交易?

如何使用 NodeJS 从 EC2 连接和查询 PostgreSQL RDS?

nodejs 热更新