【问题标题】:Elixir/Phoenix Endpoint broadcast from another moduleElixir/Phoenix Endpoint 从另一个模块广播
【发布时间】:2025-12-02 12:50:01
【问题描述】:

我有一个频道,当你连接到它时,它会在后端做一些事情。后端作业完成后,我需要发回响应。 这是我的频道:

  def join("boot", _, socket) do
    Launcher.start()
    {:ok, socket}
  end

  def handle_in("boot:fetch", params, socket) do
    payload = %{total_reports: 5}
    {:reply, {:ok, payload}, socket}
  end

Launcher 模块是:

defmodule App.Launcher do
  alias App.Endpoint

  def start() do
    Endpoint.broadcast! "boot", "test:my", %{total_reports: 541}
  end
end

我希望首先在test:my 上收到%{total_reports: 541},然后在前端的boot:fetch 上收到%{total_reports: 5}。但我只收到来自boot:fetch 的数据,而不是test:my

来自Launcher 模块的Endpoint.broadcast 没有广播任何内容。这是预期的行为吗?为什么我不能从频道别名的模块广播?

此外,我已经测试过将完全相同的线路放入通道中,并且可以正常工作。出于某种原因,我不能只对其他模块进行此操作。这个例子有效:

def handle_in("boot:fetch", params, socket) do
    payload = %{total_reports: 5}
    Endpoint.broadcast! "boot", "test:my", %{total_reports: 541}
    {:reply, {:ok, payload}, socket}
end

【问题讨论】:

    标签: elixir phoenix-framework endpoint phoenix-channels


    【解决方案1】:

    我的错误是加入频道时调用Endpoint.broadcast,但由于尚未建立连接,因此无法广播。搬进把手,一切正常。

    def join("boot", _, socket) do
      {:ok, socket}
    end
    
    def handle_in("boot:fetch", params, socket) do
      Launcher.start()
      payload = %{total_reports: 5}
      {:reply, {:ok, payload}, socket}
    end
    

    【讨论】:

      最近更新 更多