1
是否有可能將套接字訂閱到後端的某些Phoenix頻道而不是客戶端?假設我有一些用戶屬於的組,並且我希望用戶在建立WS連接後連接到它們。向用戶發送組ID並加入頻道似乎是不必要的往返,特別是我想在一個回調中處理該組中的消息,所以我會在Socket上使用onMessage
,並使用掩碼進行匹配。我會怎麼做?在後臺訂閱鳳凰頻道(不是channel.join())
是否有可能將套接字訂閱到後端的某些Phoenix頻道而不是客戶端?假設我有一些用戶屬於的組,並且我希望用戶在建立WS連接後連接到它們。向用戶發送組ID並加入頻道似乎是不必要的往返,特別是我想在一個回調中處理該組中的消息,所以我會在Socket上使用onMessage
,並使用掩碼進行匹配。我會怎麼做?在後臺訂閱鳳凰頻道(不是channel.join())
不知道這是一個很好的解決方案,可能是它使用了雖然不是私有的一些內部API:
defmodule Front.UserChannel do
use Front.Web, :channel
def join("user:" <> user_id, _payload, socket) do
if Integer.to_string(socket.assigns[:user_id]) == user_id do
send(self(), :after_join)
{:ok, socket}
else
{:error, %{reason: "unauthorized"}}
end
end
def handle_info(:after_join, socket) do
Groups.associated_with(socket.assigns[:user_id])
|> Enum.each(fn group_id ->
%Phoenix.Socket{socket | topic: "group:#{group_id}", channel: Front.GroupChannel}
|> Phoenix.Channel.Server.join(%{})
end)
{:noreply, socket}
end
end