You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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端口写入的区别上?有没有大佬知道这中间的坑,或者能给我指几个排查方向?谢谢大家了!

火山引擎 最新活动