Phoenix (elixir) channel usage with WebSocket (js)



经过 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 中没有函数子句匹配

我不明白为什么,而且由于我对 websocket 不是很满意,所以我有点迷茫。

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

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

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,因此您应该检查一下。

凤凰频道

最新更新