2016-07-24 3 views
3

내 앱에서 다른 채널로 브로드 캐스트하려고하는데 작동하지 않습니다. 또한 테스트를 쓰려고하는데 어떻게해야할지 모르겠습니다.다른 채널로 브로드 캐스트 Phoenix 1.1.6

내가 수집 할 수있는 것으로부터 나는 notification_channel에서 메시지를 브로드 캐스팅하는 데 성공했지만 chat_channel에서는 수신되지 않았습니다.

알림은 채팅으로 보내야합니다.

test "do we send a new:recommendation to chat ?", %{guardian_token: guardian_token} do 
     nils_base_64 = Base.encode64("user:nils") 

     {:ok, socket} = connect(UserSocket, %{}) 
     {:ok, _, socket1} = subscribe_and_join(socket, "notifications:"<>nils_base_64, %{"guardian_token" => guardian_token}) 
     {:ok, _, socket} = subscribe_and_join(socket1, "chat:Y2hhdDpjaGF0Mw==", %{"guardian_token" => guardian_token}) 

     payload = %{ 
      "message" => "look at this cool thing!", 
      "url" => "link to stuff", 
      "title" => "AWESOME EVENT", 
      "groups" => ["Y2hhdDpjaGF0Mw==", "Y2hhdDpwdWJsaWM="] 
     } 

     reply = %{message: "look at this cool thing!", title: "AWESOME EVENT", url: "link to stuff", user_grapqhl_id: nils_base_64, user_name: "Nils Eriksson"} 

     ref = push socket1, "new:group:recommendation", payload 
     assert_reply ref, :ok 
     assert_broadcast "new:recommendation", ^reply 
    end 

이 시험 피 시험

def handle_in("new:recommendation", msg, socket) do 
     IO.puts "i am a recommendation !" 
     IO.inspect msg 
     chat_msg = %{ 
     "creator_id" => msg["user_grapqhl_id"], 
     "text" => msg["message"], 
     "creator_name" => msg["user_name"] 
     } 

    broadcast! socket, "new:msg", create_chat_msg(chat_msg,socket) 
    {:reply, :ok, socket} 
    end 

chat_channel.ex

def handle_in("new:group:recommendation", msg, socket) do 
    payload = %{ 
     message: msg["message"], 
     url: msg["url"], 
     title: msg["title"], 
     user_name: get_name_of_user(socket.assigns.user_grapqhl_id), 
     user_grapqhl_id: socket.assigns.user_grapqhl_id 
    } 

    IO.puts "incomming" 
    IO.inspect msg 
    Enum.map(msg["groups"], fn(x) -> 
     App.Endpoint.broadcast_from! self(), "chat:"<>x, 
      "new:recommendation", payload 
     end) 
    {:reply, :ok, socket} 

    end 

notification_channel.ex 엉덩이 그리고 난 reply 또는 방송을 주석으로 변경하여 실패 할 수 있습니다. handle_infail:please이되도록 chat_channel으로 변경하면 실패 할 수 없습니다. 그게 내가 이걸 보내면 불평할만한 것이지 ref = push socket1, "new:group:recommendation", payload ~ ref = push socket, "new:group:recommendation", payload이 경우에는 그럴 수 없습니다.

이것은 전선에있는 것입니다.

 Process mailbox: 
    %Phoenix.Socket.Message{event: "init:msgs", payload: %{messages: []}, ref: nil, topic: "chat:Y2hhdDpjaGF0Mw=="} 
    %Phoenix.Socket.Broadcast{event: "new:recommendation", payload: %{message: "look at this cool thing!", title: "AWESOME EVENTs", url: "link to stuff", user_grapqhl_id: "dXNlcjpuaWxz", user_name: "Nils Eriksson"}, topic: "chat:Y2hhdDpjaGF0Mw=="} 
    %Phoenix.Socket.Message{event: "new:recommendation", payload: %{message: "look at this cool thing!", title: "AWESOME EVENTs", url: "link to stuff", user_grapqhl_id: "dXNlcjpuaWxz", user_name: "Nils Eriksson"}, ref: nil, topic: "chat:Y2hhdDpjaGF0Mw=="} 

내가 사용하는 elm 패키지가 아직 소켓 수준의 인증을 지원하지 않기 때문에 채널 인증을 사용합니다.

alias Phoenix.Socket.Broadcast 
    ... 

def handle_info(%Broadcast{topic: _, event: ev, payload: payload}, socket) do 
    IO.puts ev 
    IO.inspect payload 
    # do something with ev and payload(push or broadcast) 
    {:noreply, socket} 
    end 

아니면 해당 이벤트를들을 수 있습니다 : 그래서 이것은

답변