如何使用Phoenix向特定套接字发送消息

use*_*168 10 elixir phoenix-framework

我有一些验证套接字:

defmodule Test.UserSocket do
  use Phoenix.Socket

  ## Channels
  channel "user:*", Test.RoomChannel

  def connect(_params, socket) do
    case Phoenix.Token.verify(socket, "user",  _params["token"]) do
          {:ok, uid} ->
            {:ok, assign(socket, :user_id, uid)}
          {:error, _} ->
            :error
     end
  end

 def id(_socket), do: "user:#{_socket.assigns.user_id}"
end
Run Code Online (Sandbox Code Playgroud)

并在连接套接字后命名为 user:#id

从文档中我可以发送断开连接事件 Test.Endpoint.broadcast("users_socket:" <> user.id, "disconnect", %{})

问题:如何将自定义事件发送到套接字user:#id,它应该像是对特定套接字的推送通知.

我试过Test.Endpoint.broadcast "user:1", "new:msg", %{user: "SYSTEM", body: "iex"}但它不起作用,因为我无法在套接字上听"new:msg".

Ono*_*cci 4

从评论中复制克里斯·麦科德的回答:

您可以在您所描述的频道上执行此操作。join/3如果您已经在连接中的套接字上验证并分配了当前用户,则无需进行验证。只需检查socket.assigns.user_id用户尝试加入的房间即可。然后你向那个房间广播Endpoint.broadcast "rooms:1", "new_msg", %{user: "SYSTEM", body: "iex"}

(将答案标记为社区维基,因为如果有人决定对此进行投票,我不想要代表点。这不是我的答案:))