【问题标题】:Phoenix (elixir) channel usage with WebSocket (js)Phoenix (elixir) 通道与 WebSocket (js) 的使用
【发布时间】:2017-07-27 17:34:27
【问题描述】:

经过 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 不是很满意,所以我有点迷茫。

【问题讨论】:

  • 我已尽我所能回答您的帖子...请尝试在此处粘贴 elixir 给您的确切错误,以便我们进一步调查。

标签: websocket phoenix-framework


【解决方案1】:

我已尝试重现您的问题...我不能,它工作正常。

您可以尝试通过添加以下代码来调试自己的代码:

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

【讨论】:

  • 我最终使用了'phoenix-socket' npm 包,但我并没有真正成功地找到使用WebSocket 类的方法。这可能是其他地方的另一个错误..也许是一个关闭的连接?我永远不会知道^^
  • 您的方法是正确的,我将您的代码复制/粘贴到一个新项目中进行测试,它首先尝试...就像我说的那样,可能是某个隐藏的字符与模式匹配搞乱了
猜你喜欢
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 2019-01-12
  • 2017-01-04
  • 2017-07-24
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多