如何通过Postgres函数检测用户是否监听Supabase实时频道?
检查Supabase实时频道在线状态并创建通知的Postgres函数
核心逻辑
Supabase的实时服务会将用户的活跃订阅记录存在realtime.subscriptions系统表中——用户保持监听时,对应user_id(来自JWT认证)的条目会留存;断开连接后,该条目会自动被清理。我们可以通过查询这个表判断用户是否在线,再决定是否创建通知。
实现步骤
配置权限
先给执行函数的数据库角色授予realtime.subscriptions表的查询权限:GRANT SELECT ON realtime.subscriptions TO authenticated; -- 替换为你实际使用的角色创建判断函数
以下函数接收目标用户ID和通知内容,先检查用户是否有活跃的实时订阅,仅当用户不在线时插入通知记录:CREATE OR REPLACE FUNCTION create_notification_if_offline(p_user_id UUID, p_content TEXT) RETURNS BOOLEAN AS $$ BEGIN -- 检查用户是否存在活跃订阅 IF NOT EXISTS ( SELECT 1 FROM realtime.subscriptions WHERE user_id = p_user_id ) THEN -- 插入通知(假设你的通知表为notifications,结构可按需调整) INSERT INTO notifications (user_id, content, created_at) VALUES (p_user_id, p_content, NOW()); RETURN TRUE; -- 返回通知创建成功状态 ELSE RETURN FALSE; -- 用户在线,未创建通知 END IF; END; $$ LANGUAGE plpgsql SECURITY DEFINER;
注意事项
realtime.subscriptions中的user_id仅适用于JWT认证且开启RLS的订阅场景,匿名订阅的user_id为NULL,无法用此字段判断特定匿名用户。- 如果需要针对特定频道判断(而非用户所有订阅),可在
WHERE子句中添加channel = '目标频道名'过滤。 SECURITY DEFINER让函数以创建者权限执行,确保能访问realtime.subscriptions表,使用后需设置函数所有者为合适角色,并限制调用权限。
内容的提问来源于stack exchange,提问作者Ruud14
相关产品推荐
相关产品推荐

