获取conn为Phoenix Framework分配频道

时间:2017-05-29 04:10:22

标签: phoenix-framework

我需要从我的频道中的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。我应该如何获得这些作品?

1 个答案:

答案 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