使用Prisma通过事务池(PgBouncer)写入数据时,Supabase Realtime无法接收INSERT事件的求助
使用Prisma通过事务池(PgBouncer)写入数据时,Supabase Realtime无法接收INSERT事件的求助
我现在正在用Next.js、Supabase和Prisma开发一个实时聊天应用,但在Realtime订阅这块卡了好一阵,想请教下大家有没有遇到过类似的情况?
我的环境与架构
- 前端:Next.js + supabase-js客户端(使用匿名密钥)
- 后端:Node.js + Prisma处理数据库写入(通过事务池连接)
- 数据库:Supabase Postgres
问题详情
前端的Supabase客户端能成功连接WebSocket,状态日志明确显示SUBSCRIBED,但当用户从前端发消息、后端通过Prisma(走事务池)写入新的Message记录时,前端完全收不到INSERT事件。手动刷新页面能看到新消息,说明数据确实成功写入了数据库,问题就出在:通过事务池写入时,Realtime事件没触发(或者没传到客户端)。
我做的排查与配置细节
1. 数据库配置
为了排除权限问题,我临时禁用了RLS,还给相关表开启了全量复制身份:
ALTER TABLE "Message" REPLICA IDENTITY FULL; ALTER TABLE "ChatRoom" REPLICA IDENTITY FULL; -- 测试阶段暂时禁用了RLS
2. Prisma后端连接配置
我用的是Supabase的事务池(端口6543),.env里的连接串如下:
DATABASE_URL="postgresql://postgres.[project]:[password]@aws-0-[region].pooler.supabase.com:6543/postgres?pgbouncer=true"
3. 前端订阅代码
我试过带过滤和不带过滤的写法,甚至把事件改成*,都没触发回调:
const channel = supabase .channel(`room:${roomId}`) .on( 'postgres_changes', { event: 'INSERT', // 也试过用'*' schema: 'public', table: 'Message', filter: `chatRoomId=eq.${roomId}`, // 也试过去掉这个过滤条件 }, (payload) => { console.log('New message received:', payload); // 这里从来没执行过 } ) .subscribe((status) => { console.log('Realtime connection status:', status); // 这里能正常输出'SUBSCRIBED' });
我的核心疑问
Supabase Realtime是不是依赖特定的连接类型来触发WAL(预写日志)?我怀疑问题出在通过事务池(PgBouncer/6543端口)写入和直接连5432端口写入的区别上?有没有大佬知道这中间的坑,或者能给我指几个排查方向?谢谢大家了!




