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

时间:2019-04-16 08:02:24

标签: node.js database postgresql

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

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

您有两个选择:拉动与推动。

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

这有很多好处:可测试,可以关闭发送电子邮件的“副作用”,当您进行批量插入(例如,还原备份后),进行审核时,这很方便。并且您可以控制性能影响。缺点是数据库操作和电子邮件发送之间存在延迟。如果您有许多安排好的工作来执行类似的任务,则可能会影响性能。

我知道“ push”选项正在使用数据库触发器。您可以根据需要编写自定义trigger in JavaScript,尽管我建议不要在触发器的上下文中发送电子邮件-对性能的影响可能会很可怕。

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

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

这些选项的优点是(几乎)即时通知数据库更改应用程序,并且事件流将“侦听器”与数据库完全断开。但是,您必须特别注意性能方面,并且可能需要关闭电子邮件发送功能,例如做批量数据操作时。