【发布时间】:2022-04-11 21:29:31
【问题描述】:
是否可以在后端而不是从客户端订阅套接字到某些 Phoenix 频道?假设我有一些用户所属的组,并且我希望用户在建立 WS 连接后连接到它们。向用户发送组 ID 并加入频道似乎是不必要的往返,尤其是我想在一个回调中处理该组中的消息,所以我会在 Socket 上使用 onMessage 并通过掩码匹配。我该怎么做?
【问题讨论】:
标签: sockets websocket phoenix phoenix-channels
是否可以在后端而不是从客户端订阅套接字到某些 Phoenix 频道?假设我有一些用户所属的组,并且我希望用户在建立 WS 连接后连接到它们。向用户发送组 ID 并加入频道似乎是不必要的往返,尤其是我想在一个回调中处理该组中的消息,所以我会在 Socket 上使用 onMessage 并通过掩码匹配。我该怎么做?
【问题讨论】:
标签: sockets websocket phoenix phoenix-channels
不确定这是否是一个好的解决方案,可能它使用了一些非私有的内部 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
【讨论】:
也许这会有所帮助。 https://www.erlang.org/doc/man/gen_tcp.html
{ok, Socket} = gen_tcp:connect(host/addr, port,[binary/list, {packet, 2}])
【讨论】: