SuperAPI AI 工具集

supabase-realtime

编程与开发

查看项目

更新于 10-15 10:53

技能介绍

用途

Supabase Realtime 用于为应用添加实时能力,主要覆盖三类场景:数据库行变更订阅、客户端之间的消息广播,以及在线用户状态追踪。适合实现实时功能、实时更新、聊天或在线状态追踪。

主要能力

Postgres Changes(数据库订阅)

监听数据库表的行变更,支持 INSERT、UPDATE、DELETE 事件。

启用某张表的 Realtime:

-- Enable realtime for a table
ALTER PUBLICATION supabase_realtime ADD TABLE posts;

-- Enable for specific columns only
ALTER PUBLICATION supabase_realtime ADD TABLE posts (id, title, status);

订阅所有变更:

const channel = supabase
  .channel('posts-changes')
  .on(
    'postgres_changes',
    { event: '*', schema: 'public', table: 'posts' },
    (payload) => {
      console.log('Change:', payload)
      // payload.eventType: 'INSERT' | 'UPDATE' | 'DELETE'
      // payload.new: new row data
      // payload.old: previous row data (UPDATE/DELETE only)
    }
  )
  .subscribe()

可只订阅特定事件(INSERT、UPDATE 或 DELETE),也可按列值过滤,例如 filter: 'status=eq.published' 或 filter: user_id=eq.${userId}``。支持在同一频道上添加多个监听器,分别监听不同表。

Broadcast(客户端到客户端)

用于客户端之间的消息传递,例如聊天和通知。发送前需先订阅,订阅成功(状态为 SUBSCRIBED)后调用 channel.send 发送消息,接收方通过 .on('broadcast', { event: 'message' }, callback) 监听。

聊天示例中,使用频道 ID 作为房间,监听 new-message 事件并发送包含用户名、消息内容和时间戳的 payload。

Presence(在线用户)

用于追踪在线用户和输入状态指示。订阅成功后调用 channel.track 上报当前用户信息,通过 presence 事件的 sync、join、leave 监听状态变化,使用 channel.presenceState() 获取当前在线用户列表,调用 channel.untrack() 下线。

使用方式

提供 JavaScript 客户端 API 用法,并包含 React 模式示例:

  • 数据库订阅 Hook:先做初始数据拉取,再订阅变更,根据 eventType 分别处理 INSERT、UPDATE、DELETE 更新本地状态,组件卸载时调用 supabase.removeChannel(channel) 清理。
  • Presence Hook:订阅 presence 的 sync 事件更新在线用户列表,订阅成功后 track 当前用户,卸载时 untrack 并移除频道。

订阅状态回调可获取 SUBSCRIBED、TIMED_OUT、CLOSED、CHANNEL_ERROR 等状态值。清理方式包括 supabase.removeChannel(channel) 移除单个频道和 supabase.removeAllChannels() 移除所有频道。

访问控制

Realtime 遵循 RLS 策略,用户只能看到其有权访问的变更。可为表创建 SELECT 策略控制实时可见范围。对于 broadcast 和 presence,可对 realtime.messages 使用 RLS 策略控制频道访问,例如使用 realtime.topic() 匹配频道主题。若需在 UPDATE/DELETE 时访问旧记录,需设置 ALTER TABLE posts REPLICA IDENTITY FULL;。

过滤操作符

支持 eq、neq、in 三种过滤操作符,例如 filter: 'status=eq.active'、filter: 'status=neq.deleted'、filter: 'status=in.(active,pending)'。注意:每个订阅仅支持 1 个过滤器。

适用场景

实时数据更新、聊天、通知、在线用户追踪、输入状态指示等需要实时交互的应用。

限制

每个订阅仅支持 1 个过滤器;UPDATE/DELETE 的旧记录访问需开启 REPLICA IDENTITY FULL;broadcast 和 presence 的授权需通过 realtime.messages 的 RLS 策略配置。