我有一些带验证的套接字:
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;在插座上。
答案 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