使用WebSocket(js)的Phoenix(elixir)频道使用

时间:2017-07-26 16:25:28

标签: websocket phoenix-framework

在完整搜索1天后,我找不到如何通过WebSocket javascript类向Phoenix频道发送活动的方法。

这是我的频道定义:

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

中没有匹配的函数子句

我不明白为什么,因为我对websockets不太满意,所以我有点失落。

1 个答案:

答案 0 :(得分: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为您提供了一整套函数来处理Channels,而无需使用原始Websockets对所有内容进行编码。既然你(对你而言)不熟悉WebSockets,你应该检查一下。

Phoenix Channels