0

我有基于docs完美运行的频道,并且我的应用程序正在按预期接收和重新广播消息:

在此处输入图像描述

这是处理通道的代码:

defmodule HelloWeb.RoomChannel do
  use Phoenix.Channel

  def join("room:lobby", _message, socket) do
    {:ok, socket}
  end
  def join("room:" <> _private_room_id, _params, _socket) do
    {:error, %{reason: "unauthorized"}}
  end

  def handle_in("new_msg", %{"body" => body}, socket) do
    broadcast!(socket, "new_msg", %{body: body})
    {:noreply, socket}
  end
end

然而,我真正想要的是通过这个 Phoenix 频道发送来自不同 Elixir 进程的消息(恰好通过 websockets 订阅了第三方 API)。因此,每当我从第三方处理程序进程中获得 websocket 消息时,我都想将该消息发送到该RoomChannel模块,并让它将消息沿通道发送到浏览器。

我该怎么做呢?是否有一个handle_info我可以编写的 GenServer 样式的处理程序来侦听其中的传入消息RoomChannel并将其发送到 Phoenix 通道?

还是我必须以某种方式将 Phoenix 套接字发送到另一个 GenServer 以在那里处理它?

4

1 回答 1

1

Phoenix.Channel不是单独GenServer的,它Phoenix.Channel.Server在下面使用,但它模仿了GenServer行为。这未在主要教程文档中显示,但如果您查看参考资料,您可以找到它:

Phoenix.Channel.handle_info/2.

于 2021-03-08T03:56:26.310 回答