由于broadcast!
会向订阅除发件人之外的主题的所有用户发送消息,是否可以除某些用户外?或发送给特定用户?
我需要用户将事件推送到频道,但只有管理员用户才会收到消息,其他用户不会收到消息,只会发送消息。
我可以在客户端解决这个问题,只需让用户忽略他们通过broadcast!
收到的消息,只有管理员用户处理收到的消息,但是如何在服务器端解决这个问题?
简而言之,加入频道,但可以只读,还是仅发送?
答案 0 :(得分:1)
如果您按照https://hexdocs.pm/phoenix/Phoenix.Token.html
中的说明将用户存储在套接字上defmodule MyApp.UserSocket do
use Phoenix.Socket
def connect(%{"token" => token}, socket) do
case Phoenix.Token.verify(socket, "user", token, max_age: 1209600) do
{:ok, user_id} ->
socket = assign(socket, :user, Repo.get!(User, user_id))
{:ok, socket}
{:error, _} -> #...
end
end
end
然后,您可以在频道documented here的handle_out
功能中查看用户管理状态:
defmodule HelloPhoenix.RoomChannel do
intercept ["new_msg"]
...
def handle_out("new_msg", payload, socket) do
if socket.assigns.user.admin do
push socket, "new_msg", payload
end
{:noreply, socket}
end
end
根据您的邮件量和管理员数量,您可以考虑为这些活动设置特定于管理员的渠道。这样可以防止将消息发送到非管理员用户的进程,而不是简单地忽略它们。