ho un po 'presa con la verifica:Come inviare un messaggio a presa specifico con Phoenix
defmodule Test.UserSocket do
use Phoenix.Socket
## Channels
channel "user:*", Test.RoomChannel
def connect(_params, socket) do
case Phoenix.Token.verify(socket, "user", _params["token"]) do
{:ok, uid} ->
{:ok, assign(socket, :user_id, uid)}
{:error, _} ->
:error
end
end
def id(_socket), do: "user:#{_socket.assigns.user_id}"
end
E dopo presa di connessione di nome come user:#id
Dalla documentazione posso inviare caso di disconnessione Test.Endpoint.broadcast("users_socket:" <> user.id, "disconnect", %{})
Domanda: Come inviare un evento personalizzato al socket tramite user:#id
, dovrebbe essere come una notifica push a un socket specifico.
Ho provato Test.Endpoint.broadcast "user:1", "new:msg", %{user: "SYSTEM", body: "iex"}
ma non funziona, perché non riesco ad ascoltare "nuovo: msg" sul socket.
opere di quando mi unisco la stanza specifica var chan = socket.channel ("user': 1 ", {})' ma è richiesta una verifica aggiuntiva in 'join' – user1156168
Lo fai su un canale come hai descritto. Non è necessario verificare in join/3 se hai già verificato e assegnato un utente corrente al socket in connessione. Basta controllare socket.assigns.user_id contro qualsiasi stanza l'utente stia tentando di partecipare. Quindi trasmetti alle stanze "Endpoint.broadcast" della stanza: 1 "," new_msg ",% {user:" SYSTEM ", body:" iex "} –
Grazie per la risposta. Quindi lavoriamo solo su basi 'stanza'. E le mie fonti saranno come: 'def join (" utente: "<> _uid, message, socket) do if _uid == socket.assigns.user_id do {: ok, socket} else {: error,% { motivo: "non autorizzato"}} fine fine' – user1156168