数据库

数据库 Webhooks

在数据库事件发生时触发外部负载。


数据库 Webhooks 允许您在表事件发生时将实时数据从您的数据库发送到另一个系统。

您可以挂接到三个表事件:INSERTUPDATEDELETE。所有事件都在数据库行更改之后触发。

Webhooks 与触发器#

数据库 Webhooks 与触发器非常相似,这是因为数据库 Webhooks 只是使用 pg_net 扩展对触发器的便捷包装。此扩展是异步的,因此不会阻止您的数据库长时间运行的网络请求进行更改。

此视频演示了每次向 profiles 表插入一行时,如何在 Stripe 中创建一个新客户

创建 webhook#

  1. 在仪表板中创建一个新的 数据库 Webhook
  2. 为您的 Webhook 指定一个名称。
  3. 选择您要挂接的表。
  4. 选择您要挂接的一个或多个事件(表插入、更新或删除)。

由于 Webhooks 只是数据库触发器,因此您也可以直接从 SQL 语句创建它。

1
create trigger "my_webhook" after insert
2
on "public"."my_table" for each row
3
execute function "supabase_functions"."http_request"(
4
'http://host.docker.internal:3000',
5
'POST',
6
'{"Content-Type":"application/json"}',
7
'{}',
8
'1000'
9
);

我们目前支持 HTTP Webhooks。这些可以作为带有 JSON 有效负载的 POSTGET 请求发送。

负载#

负载会自动从基础表记录生成

1
type InsertPayload = {
2
type: 'INSERT'
3
table: string
4
schema: string
5
record: TableRecord<T>
6
old_record: null
7
}
8
type UpdatePayload = {
9
type: 'UPDATE'
10
table: string
11
schema: string
12
record: TableRecord<T>
13
old_record: TableRecord<T>
14
}
15
type DeletePayload = {
16
type: 'DELETE'
17
table: string
18
schema: string
19
record: null
20
old_record: TableRecord<T>
21
}

监控#

Webhook 调用历史记录的日志记录可在数据库的 net 模式下查看。有关更多信息,请参见 GitHub 仓库

本地开发#

在本地 Supabase 实例上使用数据库 Webhooks 时,您需要注意 Postgres 数据库在 Docker 容器内运行。这意味着您的 Webhook URL 中的 localhost127.0.0.1 将引用容器本身,而不是运行应用程序的主机机器。

要定位在主机机器上运行的服务,请使用 host.docker.internal。如果这不起作用,您可能需要使用机器的本地 IP 地址代替。

例如,如果您想在 Webhook 触发时触发一个边缘函数,您的 Webhook URL 将是

1
http://host.docker.internal:54321/functions/v1/my-function-name

如果您在使用 Webhooks 时遇到连接问题,请验证您是否正在使用正确的 hostname,而不是 localhost

资源#

  • pg_net:Postgres 的异步网络扩展