2017-07-26 11 views
0

フル検索の1日後に、WebSocket javascriptクラスを使用してPhoenixチャンネルにイベントを送信する方法が見つかりませんでした。WebSocket(js)でPhoenix(elixir)チャンネルの使用

これは私のチャンネル定義である:

defmodule Test.GeneralRoomChannel do 
    use Test.Web, :channel 

    # Rejoins la room générale 
    def join("general_room:lobby", payload, socket) do 
    if authorized?(payload) do 
     {:ok, socket} 
    else 
     {:error, %{reason: "unauthorized"}} 
    end 
    end 

    def handle_in("send_msg", payload, socket) do 
    broadcast! socket, "send_msg", payload 
    {:noreply, socket} 
    end 

    # Add authorization logic here as required. 
    defp authorized?(_payload) do 
    true 
    end 
end 

私はチャンネル

this.ws = new WebSocket('ws://x.x.x.x:4000/socket/websocket'); 

this.ws.onopen =() => { 
    this.ws.send(JSON.stringify({ 
    "topic": "general_room:lobby", 
    "event": "phx_join", 
    "payload": {"username": "Peekmo"}, 
    "ref": "lfskj" 
    })); 
}; 

それは「参加」イベントのために動作しますが、私が送信する方法がわからないの参加に接続するためにこれを持っています"send_msg"イベント。私はこれを行うとき:

this.ws.send(JSON.stringify({ 
    "topic": "general_room:lobby", 
    "event": "send_msg", 
    "payload": {"body": this.state.text}, 
    "ref": "sdkfml" 
})); 

Test.GeneralRoomChannel.handle_in/3

における機能なし句マッチングを私はなぜ理解していない、と私はWebSocketを持つ非常に快適ではないよと、私は少しです失われた

+0

私は限り私はあなたのポストを与えられた可能性があるのでお答えしようとしています...ここエリキシルはあなたを与えることを正確なエラーを貼り付けようと、私たちはさらに調査することができますしてください。 – TheSquad

答えて

2

問題を再現しようとしましたが、うまくいきませんでした。あなたが追加することによって、自分自身のコードをデバッグしようとすることができます

def handle_in("send_msg", payload, socket) do 
    broadcast! socket, "send_msg", payload 
    {:noreply, socket} 
end 
def handle_in(event, payloas, socket) do 
    IO.puts("Other event: #{event}") 
    {:noreply, socket} 
end 

私見を、あなたはおそらく、サーバー側でパターンマッチングを防ぐため、文字列「send_msg」で特殊文字を持っています。 (それはあなたが見ることができないものの、あなたのコードを混乱させる種類のものです)

さらに、Phoenixはすべてをコード化することなくチャンネルを扱う完全な機能を提供するので、ホイールを再作成しないでください生のWebSocketであなたがWebSocketsに慣れ親しんでいるわけではないので、あなたはそれをチェックアウトする必要があります。

Phoenix Channels

+0

最後に 'phoenix-socket' npmパッケージを使用しましたが、WebSocketクラスを使用する方法が見つかりませんでした。それはおそらく他のどこか他のエラーだった..おそらく閉じた接続?私は決して知りません^^ – Peekmo

+0

あなたの方法は正しいです、私はそれをテストするために新しいプロジェクトにあなたのコードをコピー/貼り付け、それは最初に試してみました...私はおそらくどこかにパターンマッチング – TheSquad

関連する問題