【问题标题】:How to handle messages from another process so that they are sent on an Elixir Phoenix channel如何处理来自另一个进程的消息,以便它们在 Elixir Phoenix 通道上发送
【发布时间】:2021-06-05 22:27:55
【问题描述】:

我的频道基于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 模块,并让它通过通道将消息发送到浏览器。

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

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

【问题讨论】:

    标签: elixir phoenix-framework phoenix-channels


    【解决方案1】:

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

    Phoenix.Channel.handle_info/2.

    【讨论】:

      猜你喜欢
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 2022-10-05
      • 2018-06-04
      • 2022-01-21
      • 2019-01-15
      相关资源
      最近更新 更多