如何处理来自另一个进程的消息,以便它们在 Elixir Phoenix 通道上发送
How to handle messages from another process so that they are sent on an Elixir Phoenix channel
我的频道基于 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 进程的消息(恰好订阅了第三方 API通过网络套接字)。因此,每当我从第三方处理程序收到一条 websocket 消息时,我想将该消息发送到此 RoomChannel
模块,并让它通过通道将消息发送到浏览器。
我该怎么做?是否有我可以编写的 GenServer 风格的 handle_info
处理程序,它将侦听 RoomChannel
内的传入消息并将其发送到 Phoenix 频道?
或者我是否必须以某种方式将 Phoenix 套接字发送到另一个 GenServer 以在那里处理它?
Phoenix.Channel
本身不是 GenServer
,它在下面使用 Phoenix.Channel.Server
,但它模仿 GenServer
行为。这在主要教程文档中没有显示,但如果您查看参考资料,您可以找到它:
我的频道基于 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 进程的消息(恰好订阅了第三方 API通过网络套接字)。因此,每当我从第三方处理程序收到一条 websocket 消息时,我想将该消息发送到此 RoomChannel
模块,并让它通过通道将消息发送到浏览器。
我该怎么做?是否有我可以编写的 GenServer 风格的 handle_info
处理程序,它将侦听 RoomChannel
内的传入消息并将其发送到 Phoenix 频道?
或者我是否必须以某种方式将 Phoenix 套接字发送到另一个 GenServer 以在那里处理它?
Phoenix.Channel
本身不是 GenServer
,它在下面使用 Phoenix.Channel.Server
,但它模仿 GenServer
行为。这在主要教程文档中没有显示,但如果您查看参考资料,您可以找到它: