【问题标题】:Subscribe to Phoenix Channel on the backend (not channel.join())在后端订阅凤凰频道(不是 channel.join())
【发布时间】:2022-04-11 21:29:31
【问题描述】:

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

【问题讨论】:

    标签: sockets websocket phoenix phoenix-channels


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      也许这会有所帮助。 https://www.erlang.org/doc/man/gen_tcp.html

       {ok, Socket} = gen_tcp:connect(host/addr, port,[binary/list, {packet, 2}])
      

      【讨论】:

        猜你喜欢
        • 2017-10-08
        • 2017-03-07
        • 2021-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多