2017-08-01 2 views
0

Je reçois un message d'erreur lors de l'envoi message salle de chatobtenir erreur lors de l'analyse de massage de chat à une autre salle de chat

Room_channel.ex

def join("room:" <> _user, _, socket) do 
    send self(), :after_join 
    {:ok, socket} 
    end 

    def handle_info(:after_join, socket) do 
    {_, value} = Redix.command(:redix, ["GET", socket.assigns.user]) 
    Presence.track(socket, socket.assigns.user, %{ 
     online_at: :os.system_time(:millisecond), 
     status: value 
    }) 
    push socket, "presence_state", Presence.list(socket) 
    {:noreply, socket} 
    end 

    def handle_in("message:new", message, socket) do 

    broadcast! socket, "message:new", %{ 
     user: socket.assigns.user, 
     body: message, 
     timestamp: :os.system_time(:millisecond) 
    } 
    PhoenixChat.Endpoint.subscribe("room:" <> message["to"]) 
    PhoenixChat.Endpoint.broadcast!("room:" <> message["to"], "message:new",%{ 
     user: socket.assigns.user, 
     body: message, 
     timestamp: :os.system_time(:millisecond) 
    }) 
    milisecondstime = :os.system_time(:millisecond) 
    [room, user] = String.split(Map.get(socket, :topic), ":") 
    data = Poison.encode!(%{"created_at" => :os.system_time(:millisecond), "updated_at" => :os.system_time(:millisecond), "uuid" => UUID.uuid1(), "date" => :os.system_time(:millisecond), "from" => user, "to" => message["to"], "message" => message["value"]}) 
    Redix.command(:redix, ["SET", UUID.uuid1(), data]) 
    {:noreply, socket} 
    end 

c'est le message d'erreur de la console

[info] Replied room:Pamidu :ok 
[error] GenServer #PID<0.464.0> terminating 
** (FunctionClauseError) no function clause matching in PhoenixChat.RoomChannel.handle_info/2 
    (phoenix_chat) web/channels/room_channel.ex:14: PhoenixChat.RoomChannel.handle_info(%Phoenix.Socket.Broadcast{event: "message:new", payload: %{body: %{"to" => "rusiru", "value" => "fuck you "}, timestamp: 1501499563929, user: "abc"}, topic: "room:rusiru"}, %Phoenix.Socket{assigns: %{user: "abc"}, channel: PhoenixChat.RoomChannel, channel_pid: #PID<0.464.0>, endpoint: PhoenixChat.Endpoint, handler: PhoenixChat.UserSocket, id: nil, joined: true, pubsub_server: PhoenixChat.PubSub, ref: nil, serializer: Phoenix.Transports.WebSocketSerializer, topic: "room:abc", transport: Phoenix.Transports.WebSocket, transport_name: :websocket, transport_pid: #PID<0.421.0>}) 
    (phoenix) lib/phoenix/channel/server.ex:239: Phoenix.Channel.Server.handle_info/2 
    (stdlib) gen_server.erl:601: :gen_server.try_dispatch/4 
    (stdlib) gen_server.erl:667: :gen_server.handle_msg/5 
    (stdlib) proc_lib.erl:247: :proc_lib.init_p_do_apply/3 
Last message: %Phoenix.Socket.Broadcast{event: "message:new", payload: %{body: %{"to" => "rusiru", "value" => "fuck you "}, timestamp: 1501499563929, user: "abc"}, topic: "room:rusiru"} 
State: %Phoenix.Socket{assigns: %{user: "abc"}, channel: PhoenixChat.RoomChannel, channel_pid: #PID<0.464.0>, endpoint: PhoenixChat.Endpoint, handler: PhoenixChat.UserSocket, id: nil, joined: true, pubsub_server: PhoenixChat.PubSub, ref: nil, serializer: Phoenix.Transports.WebSocketSerializer, topic: "room:abc", transport: Phoenix.Transports.WebSocket, transport_name: :websocket, transport_pid: #PID<0.421.0>} 

ici je crée des salles de causerie d'utilisateur sagement et passant le message et le nom d'utilisateur que le message devrait être livré à. Les messages passent sans problème mais à partir de la console, il affiche cette erreur. Je n'ai aucune idée à ce sujet et trouver un moyen de résoudre ce problème. Est-il possible de corriger cette erreur?

ligne 14 est ce

def handle_info(:after_join, socket) do 

Répondre

1

Des Phoenix.Channel docs:

Note: l'appelant doit être responsable de la prévention des souscriptions en double. Après avoir appelé subscribe/1 à partir de votre point de terminaison, le même flux s'applique à la gestion des messages Elixir réguliers dans votre canal. Le plus souvent, vous allez simplement relayer l'événement et la charge utile %Phoenix.Socket.Broadcast{}:

alias Phoenix.Socket.Broadcast 
def handle_info(%Broadcast{topic: _, event: ev, payload: payload}, socket) do 
    push socket, ev, payload 
    {:noreply, socket} 
end