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

时间:2015-12-27 17:37:15

标签: 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

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

之后

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

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

我试过了Test.Endpoint.broadcast "user:1", "new:msg", %{user: "SYSTEM", body: "iex"},但它不起作用,因为我无法倾听&#34; new:msg&#34;在插座上。

2 个答案:

答案 0 :(得分:3)

从评论中删除Chris McCord的回答:

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

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

答案 1 :(得分:0)

  

感谢您的回答。所以我们只在&#39; room&#39;基地。和我的   来源将是:def join(&#34; user:&#34;&lt;&gt; _uid,message,socket)do if   _uid == socket.assigns.user_id do {:ok,socket} else {:error,%{reason:&#34; unauthorized&#34;}} end end

您不需要再次验证userId,因为您已经在UserSocket #connect中定义了逻辑,如果用户未经过身份验证,他会收到一条他未授权的消息,您可以使用userId检查用户是否有权查看特定频道

def join("rooms:some_private_room", message, socket) do 
  if socket.assigns.user_id do 
    {:ok, socket}
  else 
    # kick him out he is not allowed here
    {:error, %{reason: "unauthorized"}} 
  end 
end