sockets - 在后端订阅 Phoenix channel (不是 channel.join())

标签 sockets websocket phoenix phoenix-channels

是否可以将套接字订阅到后端而不是客户端的某些 Phoenix channel ?假设我有一些用户所属的组,并且我希望用户在建立 WS 连接后连接到它们。向用户发送组 ID 并加入 channel 似乎是不必要的往返,尤其是我想在一个回调中处理该组中的消息,所以我会使用 onMessage在 Socket 上并通过掩码匹配。我该怎么做?

最佳答案

不确定这是否是一个好的解决方案,可能它使用了一些非私有(private)的内部 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

关于sockets - 在后端订阅 Phoenix channel (不是 channel.join()),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45341060/

相关文章:

python - ESP32 MicroPython SSL WebSocket

hadoop - Phoenix:将“字符串”列转换为“整数”列

hadoop - 在phoenix外壳中未在hbase外壳中创建表

C++ 简单聊天不适用于我的 IP 地址

javascript - 握手期间 ASP.NET Core WebSocket 失败

Python 网络套接字

elasticsearch - 无法在Elasticsearch中创建Phoenix JDBC河

windows - 如何中断 Windows 上的选择调用?

java - 需要 PHP 或 Java 代码才能使用多个互联网连接

c++ - 如何在 C++ 中使用套接字 (UDP) 在 LAN 上查找服务器