【问题标题】:How to send message to specific socket with Phoenix如何使用 Phoenix 向特定套接字发送消息
【发布时间】: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,请您将您的回复作为答案发布,以便将来可能会看到此问题的其他人可以轻松找到答案。

标签: elixir phoenix-framework


【解决方案1】:

从评论中复制 Chris McCord 的回答:

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

(将答案标记为社区 wiki,因为如果有人决定对此表示赞同,我不想要代表点。这不是我的答案:))

【讨论】:

    【解决方案2】:

    感谢您的回答。所以我们只在“房间”基础上工作。和我的 来源将是: def join("user:" _uid, message, socket) do if _uid == socket.assigns.user_id do {:ok, socket} else {:error, %{reason: "unauthorized"}} 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2020-06-08
      • 1970-01-01
      相关资源
      最近更新 更多