2016-06-07 9 views
5

Ich bin mit Phoenix Rahmen, so:Phoenix Rahmen und passierende conn

ich den Folgecode bei /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("") 
    } 
}); 

und/web/Kanäle/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 

Ich brauche conn bei room_channel. Wie kann ich es bei socket.js weitergeben?

+3

Welche 'conn' wollen Sie? und was noch wichtiger ist, was versuchst du mit "conn" in einem Kanal zu tun? (Anfrage, weil ein Conn nur für HTTP-Anfragen AFAIK erstellt wird.) – Dogbert

+1

Ich möchte Benutzerinformationen aus der Datenbank abrufen, und ich brauche conn, da hier einige Informationen für Abfrage in Sitzung gespeichert sind. Also ich will: conn bekommen -> Benutzer in db finden -> Benutzerinfo holen -> Dinge wie "Benutzername" auf Chat-Nachricht anwenden – bartezr

Antwort

5

Hier ist die Lösung für Sie. In Ihrem router.ex.You legte einen Benutzertoken wie:

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 

und dann können Sie in Ihrer Pipeline stecken:

pipeline :browser do 
... 
plug :put_user_token 
end 

und stellen Sie sicher, dass Sie Ihren Benutzertoken in Ihrem app.html setzen .eex:

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

Jetzt können Sie Ihre Steckdose in socket.js überprüfen:

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

und in Ihrem user_socket.ex.You Token mit Sockel zuordnen:

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 

schließlich in deinem Kanal:

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