Godot连接Supabase Realtime后WebSocket立即断开问题求助
解决Godot中Supabase WebSocket连接后立即断开的问题
核心原因:订阅消息格式不符合Supabase Realtime规范
你的WebSocket连接建立后马上断开,基本是因为订阅请求的格式不满足Supabase的要求,当前的subscribe_message有两处关键错误:
1. Topic格式写错了
你把筛选条件直接拼在Topic里的方式不对,正确的Topic格式应该是:
realtime:<schema名>:<表名>
默认schema是public,所以针对lobbies表的Topic应该是realtime:public:lobbies,筛选特定大厅的逻辑要放在config字段里,不是Topic的一部分。
2. 缺少必填的config字段
订阅请求必须包含config字段,用来指定监听类型(比如数据库变更、广播)和筛选规则。针对你要监听特定大厅状态变化的需求,需要配置数据库变更监听和行级筛选条件。
修正后的订阅代码
把你的_on_connection_established函数换成下面的代码:
func _on_connection_established(): is_connected = true print("WebSocket connection established.") var subscribe_message = { "type": "subscribe", "topic": "realtime:public:lobbies", "event": "*", "ref": "lobby_subscription", "config": { "broadcast": { "ack": false, "self": false }, "database": { "schema": "public", "table": "lobbies", "filter": "id=eq." + str(UserData.current_lobby_id) }, "presence": { "key": "" } } } socket.send_text(JSON.stringify(subscribe_message)) print("Subscribed to lobbies changes. Current lobby id: " + str(UserData.current_lobby_id))
额外要检查的点
- URL语法修正:你提供的WebSocket URL末尾多了个
.(UserData.token.),得删掉这个多余的点,保证URL格式正确。 - Supabase控制台配置:
- 确认在Supabase控制台的Realtime面板里,已经开启了
public.lobbies表的Realtime功能。 - 检查行级安全(RLS)规则,确保当前用户有权访问ID为
UserData.current_lobby_id的大厅数据,不然Supabase会直接拒绝订阅请求。
- 确认在Supabase控制台的Realtime面板里,已经开启了
- 查看错误详情:在
_on_data_received里加个对error类型消息的处理,这样能直接看到Supabase返回的具体错误原因:
match message.type: "broadcast": _handle_broadcast(message) "presence_diff": _handle_presence_diff(message) "error": print("Supabase订阅错误:", message) _: print("Unknown message type:", message.type)
内容的提问来源于stack exchange,提问作者Brykietosky
相关产品推荐
相关产品推荐

