我需要从我的频道中的conn.assigns获取一些信息。例如:
def handle_in("save", params, socket) do
values = Poison.decode!(params)
current_user = conn.assigns.current_user
changeset =
current_user
|> build_assoc(:posts)
|> Post.changeset(values)
case Repo.insert(changeset) do
{:ok, _} ->
{:reply, :ok, socket}
{:error, reason} ->
{:reply, {:error, %{:msg => reason}}, socket}
end
end
但是这里显然没有conn。我应该如何获得这些作品?
答案 0 :(得分:3)
套接字有一个assigns镜像在conn上分配。
如果您想获得用户,则需要使用Phoenix.Token.sign/4函数并在套接字上连接时传递值。
模板中的内容如下:
<%= tag :meta, name: "channel_token", content: Phoenix.Token.sign(@conn, "user", @current_user.id) %>
这在你的JS中:
const token = document.querySelector('meta[name=channel_token]').getAttribute('content');
const socket = new Socket('/socket', {params: {token: token}});
然后,您可以像这样验证套接字中的令牌(取自the docs):
defmodule MyApp.UserSocket do
use Phoenix.Socket
def connect(%{"token" => token}, socket) do
# Max age of 2 weeks (1209600 seconds)
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, _} ->
:error
end
end
end