내 피닉스 1.3 응용 프로그램에 채팅 기능을 추가하기 위해 함께 피닉스 채널, 토큰 및 존재 모듈을 묶을려고합니다. 3 가지 모듈 모두를 함께 사용할 수 없었습니다. 마지막 오류는 connection to websocket closed before handshake
입니다. 이제 오류가 발생하지 않지만 소켓에도 연결되지 않습니다.연결 피닉스 토큰과 소켓 및 현재
저는이 문제가 player_socket.ex의 "연결"기능이라고 생각합니다. (나는 플레이어 리소스가있다). 다음은 함수입니다.
def connect(%{"token" => token}, socket) do
case Phoenix.Token.verify(socket, "player auth", token, max_age: @max_age) do
{:ok, player_id} ->
player = Repo.get!(Player, player_id)
{:ok, assign(socket, :current_player, player)}
{:error, _reason} ->
:error
end
end
app.html.eex의 메타 태그에 토큰에 서명하고 있습니다.
<%= tag :meta, name: "channel_token", content: Phoenix.Token.sign(@conn, "player auth", :player_id) %>
그런 다음 lobby_channel.ex에서 I는 채널에 가입하기 위해 노력하고있어 :
def join("lobby:lobby", _params, socket) do
send(self(), :after_join)
{:ok, assign(socket, :player_id, :current_player)}
end
def handle_info(:after_join, socket) do
push socket, "presence_state", Presence.list(socket)
{:ok, _} = Presence.track(socket, socket.assigns.current_player, %{
online_at: inspect(System.system_time(:seconds))
})
{:noreply, socket}
end
내가 문서 읽기를하지만 함께 웹 소켓에 연결할 수없는거야 이유를 알아낼 수 없습니다 Presence를 사용하여 온라인 상태 인 사람과 플레이어의 이름을 채팅 메시지와 연관시킬 수 있도록 "current_player" 어떤 통찰력이라도 대단히 감사합니다! 나는 여기에 환매 특약이 있습니다. 나는 current_player "로 CONN에서 플레이어 구조체를 저장하기 위해"current_player "플러그를 사용하고
https://github.com/EssenceOfChaos/gofish
UPDATE를
다음%Plug.Conn{adapter: {Plug.Adapters.Cowboy.Conn, :...},
assigns: %{current_player: %Gofish.Accounts.Player{__meta__: #Ecto.Schema.Metadata<:loaded, "players">,
email: "[email protected]", id: 6,
내 업데이트됩니다 lobby_channel.ex :
def join("lobby:lobby", _params, socket) do
send(self(), :after_join)
{:ok, socket}
end
def handle_info(:after_join, socket) do
push socket, "presence_state", Presence.list(socket)
{:ok, _} = Presence.track(socket, socket.assigns.current_player.id, %{
username: socket.assigns.current_player.username,
online_at: inspect(System.system_time(:seconds))
})
{:noreply, socket}
end
대답 할 시간을내어 주셔서 감사합니다 내부
first.username
대신id
사용하십시오! 당신이 옳았습니다. 실제 ID가 아닌 "player_id"원자를 할당했습니다. 나는 여전히 토큰에 대한 가치를 얻었 기 때문에주의를 기울이지 않았다. --- 전송 : WS에 연결 : // localhost를 : 나는이 웹 소켓에 연결하고 지금 그래서 나는 확실히 일부 진전 만들었어요? 4000/소켓/웹 소켓을 토큰 = SFMyNTY.g3QAAAACZAAEZGF0YWEGZAAGc2lnbmVkbgYAcXFphWAB.JzSzRcaWpebtBk2kH5ooeqKr8ez3Lxi8IuyRkuh0qxU 및 VSN = 2.0.0 정의되지 않은 --- 하지만 현재 상태 모듈에 온라인 사용자가 표시되지 않습니다. socket.js에서 "first.username"을 사용하려고합니다. –아, 그 오류는 지적하고 싶지 않습니다. 귀하의'socket.js'에'chatInput = document.querySelector ("# chat-input ");하지만 실제로는'let chatInput = document.querySelector ("# chatInput ");'이 템플릿에 ID를 작성한 방법입니다. – Mario
이제 로그인 한 사용자가 표시됩니다. 답변 주셔서 감사합니다! 다른 브라우저로 로그인하고 새 계정을 등록하면 두 번 로그인 한 동일한 사용자가 표시됩니다. 그 이유는 무엇입니까? –