2016-06-07 19 views
5

Sto usando quadro Phoenix, in modo da:Phoenix quadro e passando conn

Ho il codice seguito a /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("") 
    } 
}); 

e al/web/canali/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 

Ho bisogno di ottenere conn at room_channel. Come posso passarlo su socket.js?

+3

Quale 'conn' vuoi? e, cosa più importante, cosa stai cercando di fare con 'conn' in un canale? (Chiedere perché un Conn è stato creato solo per richieste HTTP AFAIK.) – Dogbert

+1

Mi piacerebbe avere informazioni utente dal database, e ho bisogno di conn perché qui ci sono alcune informazioni per la query salvata in sessione. Quindi voglio: get conn -> trova utente in db -> recupera informazioni utente -> applica cose come "username" al messaggio di chat – bartezr

risposta

5

Ecco la soluzione per voi. Nella vostra router.ex.You messo un token utente come:

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 

e quindi è possibile collegare la pipeline:

pipeline :browser do 
... 
plug :put_user_token 
end 

e assicuratevi di mettere il token utente nella tua app.html .eex:

<script>window.userToken = "<%= assigns[:user_id] %>"</script> 

Ora è possibile controllare la presa in socket.js:

let socket = new Socket("/socket", {params: {token: window.userToken}}) 

e nella tua user_socket.ex.You può assegnare il token con presa:

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 

Infine nel tuo canale:

def handle_info(:after_join, socket) do 
    push socket, "user_joined", %{message: "User #{socket.assigns.user_id} has joined" 
    {:noreply, socket} 
end 
Problemi correlati