我使用Phoenix Chat Room Example并且遇到路由问题。
在user_socket.ex
文件中:
defmodule Chat.UserSocket do
use Phoenix.Socket
channel "rooms:*", Chat.RoomChannel
transport :websocket, Phoenix.Transports.WebSocket
def connect(_params, socket) do
{:ok, socket}
end
def id(_socket), do: nil
end
我遇到的问题是transport
配置。
transport :websocket, Phoenix.Transports.Websocket
设置传输基本上就像一个目录。要通过此套接字进行连接,客户端必须在/websocket
末尾URL
。我试图优雅地删除它。我试图让我的websocket服务器被server:port
访问,没有目录要求。
我发现从Chat.UserSocket
调用lib/chat/endpoint.ex
模块:
socket "/Balancer", Chat.UserSocket
这个socket
还添加了另一个必需目录。因此,要连接到websocket
服务器,您需要将/Balancer/websocket
附加到网址。我试图删除该要求。我可以缩短单词,并使用B/W
,但这似乎不直观。此外,我对Elixir / Phoenix相当新,所以我为这个草率的问题道歉。
答案 0 :(得分:2)
为webockets提供单独的路径是个好主意。使用标准80或443端口Shall I use WebSocket on ports other than 80?
的原因有多种原因默认情况下,java脚本中的套接字构造函数会添加websocket
部分,但您可以轻松地分配您想要的任何内容:
socket.endPoint = "/ws"
在端点中,您可以在root上匹配:
socket "/", Chat.UserSocket
并在您需要使用的用户套接字中:
transport :ws, Phoenix.Transports.WebSocket
完全可以在JS方面使用“/”而不使用任何其他路径作为您的websocket的根目录,但如果您在此聊天示例中尝试它,您将看到请求在Chat.PageController.index
上匹配。您可以尝试使用空原子进行传输:""
,但它有点hacky并且可能无效,所以我会坚持/ws
路径。