Ich habe einen Socket mit Verifizierung:
%Vor% Und nach dem Verbindungssocket wie user:#id
Aus der Dokumentation kann ich das Ereignis disconnect senden
Test.Endpoint.broadcast("users_socket:" <> user.id, "disconnect", %{})
Frage: Wie man ein benutzerdefiniertes Ereignis per user:#id
an Socket sendet, sollte es wie eine Push-Benachrichtigung an einen bestimmten Socket sein.
Ich habe versucht, Test.Endpoint.broadcast "user:1", "new:msg", %{user: "SYSTEM", body: "iex"}
, aber es funktioniert nicht, weil ich nicht "neu: msg" auf Socket hören kann.
Kopieren von Chris McCords Antwort aus dem Kommentar:
Sie tun es auf einem Kanal, den Sie beschrieben haben. Sie müssen nicht in join/3
überprüfen, wenn Sie bereits einen aktuellen Benutzer auf dem Socket in connect überprüft und zugewiesen haben. Überprüfen Sie socket.assigns.user_id
gegenüber dem Raum, in dem sich der Benutzer befindet. Dann senden Sie in diesen Raum Endpoint.broadcast "rooms:1", "new_msg", %{user: "SYSTEM", body: "iex"}
(Antwort als Community-Wiki markieren, da ich die Rep-Punkte nicht möchte, wenn jemand entscheidet, dies zu verbessern. Es ist nicht meine Antwort :))
Danke für die Antwort. Wir arbeiten also nur auf "Raum" -Basen. Und mein Quellen werden wie sein: def join ("user:" & lt; & id; uid, message, socket) mache es wenn _uid == socket.assigns.user_id do {: ok, socket} else {: Fehler,% {Grund: "unauthorized"}} end end
Sie müssen die userId nicht erneut verifizieren, da Sie die Logik bereits in UserSocket # connect definiert haben. Wenn der Benutzer nicht authentifiziert ist, erhält er eine Nachricht, die er nicht autorisiert. Was Sie tun können, ist die userId zu überprüfen wenn der Benutzer die Berechtigung zum Anzeigen eines bestimmten Kanals für Beispiel hat
%Vor%Tags und Links elixir phoenix-framework