凤凰框架和通过conn

bar*_*ezr 5 elixir phoenix-framework

我正在使用凤凰框架,所以:

我在/web/static/js/socket.js上有以下代码

chatInput.on("keypress", event => {
  if (event.keyCode === 13) {
    channel.push("new_msg", {body: chatInput.val()}); //im want to pass @conn here
    chatInput.val("")
  }
});
Run Code Online (Sandbox Code Playgroud)

和/ web/channels/room_channel:

use Phoenix.Channel
defmodule fooBar do
  def handle_in("new_msg", %{"body" => body}, socket) do #and get conn here
    broadcast! socket, "new_msg", %{body: body}
    {:noreply, socket}
  end
end
Run Code Online (Sandbox Code Playgroud)

我需要在room_channel得到conn.我怎么能在socket.js传递它?

The*_*Anh 5

这是您的解决方案.在你的router.ex.You中放置一个用户令牌,如:

defp put_user_token(conn, _) do
  current_user = get_session(:current_user)
  user_id_token = Phoenix.Token.sign(conn, "user_id", current_user.id)
  conn |> assign(:user_id, user_id_token)
end
Run Code Online (Sandbox Code Playgroud)

然后你可以插入你的管道:

pipeline :browser do
 ...
 plug :put_user_token
end
Run Code Online (Sandbox Code Playgroud)

并确保将您的用户令牌放在app.html.eex中:

<script>window.userToken = "<%= assigns[:user_id] %>"</script>
Run Code Online (Sandbox Code Playgroud)

现在你可以在socket.js中检查你的套接字:

let socket = new Socket("/socket", {params: {token: window.userToken}})
Run Code Online (Sandbox Code Playgroud)

并在您的user_socket.ex.You可以为您的令牌分配套接字:

def connect(%{"token" => user_id_token}, socket) do
    case Phoenix.Token.verify(socket, "user_id", user_id_token, max_age: 1209600) do
      {:ok, id} ->
        {:ok, assign(socket, :user_id, id)}
      {:error, reason} ->
        reason
    end
  end
Run Code Online (Sandbox Code Playgroud)

最后在您的频道中:

def handle_info(:after_join, socket) do 
    push socket, "user_joined", %{message: "User #{socket.assigns.user_id} has joined"
    {:noreply, socket}
end
Run Code Online (Sandbox Code Playgroud)