在完整搜索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不太满意,所以我有点失落。
答案 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,你应该检查一下。