【发布时间】:2016-01-08 20:09:37
【问题描述】:
我有一些带有验证功能的套接字:
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
从文档中我可以发送断开连接事件
Test.Endpoint.broadcast("users_socket:" <> user.id, "disconnect", %{})
问题:如何通过user:#id将自定义事件发送到socket,应该类似于推送通知到特定的socket。
我尝试了Test.Endpoint.broadcast "user:1", "new:msg", %{user: "SYSTEM", body: "iex"},但它不起作用,因为我无法在套接字上收听“new:msg”。
【问题讨论】:
-
加入特定房间
var chan = socket.channel("user:1", {})时有效,但需要在join进行额外验证 -
您在您描述的频道上进行操作。如果您已经在连接的套接字上验证并分配了当前用户,则不需要在 join/3 中验证。只需针对用户尝试加入的任何房间检查 socket.assigns.user_id 即可。然后你向那个房间广播`Endpoint.broadcast "rooms:1", "new_msg", %{user: "SYSTEM", body: "iex"}
-
感谢您的回答。所以我们只在“房间”基础上工作。我的消息来源如下:
def join("user:"<> _uid, message, socket) do if _uid == socket.assigns.user_id do {:ok, socket} else {:error, %{reason: "unauthorized"}} end end -
嘿@ChrisMcCord,请您将您的回复作为答案发布,以便将来可能会看到此问题的其他人可以轻松找到答案。