Supabase Realtime payload.new为空且报401未授权问题排查
Supabase Realtime 接收空payload.new及401错误问题排查
从你提供的payload里能看到明确的Error 401: Unauthorized错误,这就是导致new和old字段为空的核心原因——Realtime服务因为权限问题,没有返回实际的变更数据。
关键排查点:
- Realtime表级权限配置:即使你关闭了RLS,Supabase Realtime仍需要单独给对应角色配置表的事件访问权限。进入Supabase控制台,找到
publicschema下的ReportIdeally表,在Realtime设置里确认是否给anon角色开启了UPDATE(以及你需要监听的其他事件)权限。 - 初始化密钥的权限范围:你用
NEXT_PUBLIC_SUPABASE_KEY(即anon密钥)初始化客户端是正确的前端做法,但要确保这个密钥对应的anon角色拥有访问目标表Realtime事件的权限。 - 无需手动添加Auth Bearer:用Supabase官方SDK初始化客户端后,SDK会自动在请求头中携带对应的认证信息,不需要手动添加Bearer token。
验证步骤:
- 先将监听范围缩小到目标表,避免无关干扰:
useEffect(() => { const runsupabase = supabase .channel("report-updates") .on( "postgres_changes", { event: "UPDATE", schema: "public", table: "ReportIdeally", }, (payload) => { console.log("New Payload", payload); } ) .subscribe(); return () => { supabase.removeChannel(runsupabase); }; }, [supabase]);
- 去Supabase控制台的Realtime面板,检查全局和表级的权限设置,确保
anon角色能访问对应表的实时事件。 - 若有条件,可在后端用service role密钥初始化客户端测试(注意:该密钥禁止暴露在前端),如果测试能获取完整payload,即可确定是
anon角色的权限配置问题。
内容的提问来源于stack exchange,提问作者Simon Palmer
相关产品推荐
相关产品推荐

