के साथ विशिष्ट सॉकेट से संदेश भेजने के लिए मैं सत्यापन के साथ कुछ सॉकेट है:कैसे फीनिक्स
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
और प्रलेखन से की तरह user:#id
नामित कनेक्ट सॉकेट के बाद मैं डिस्कनेक्ट घटना भेज सकते हैं Test.Endpoint.broadcast("users_socket:" <> user.id, "disconnect", %{})
प्रश्न:user:#id
द्वारा सॉकेट में कस्टम ईवेंट कैसे भेजें, यह विशिष्ट सॉकेट पर पुश अधिसूचना की तरह होना चाहिए।
मैंने Test.Endpoint.broadcast "user:1", "new:msg", %{user: "SYSTEM", body: "iex"}
की कोशिश की लेकिन यह काम नहीं करता है, क्योंकि मैं सॉकेट पर "नया: msg" नहीं सुन सकता।
यह काम करता है उदाहरण के लिए एक विशिष्ट चैनल देखने की अनुमति है की जाँच करने के userId का उपयोग: 1 ", {}) 'लेकिन इसमें' शामिल ' – user1156168
में अतिरिक्त सत्यापन की आवश्यकता है, जैसा कि आपने वर्णित चैनल पर किया है। यदि आप कनेक्ट में सॉकेट पर वर्तमान उपयोगकर्ता को पहले से सत्यापित और असाइन कर चुके हैं तो आपको जुड़ने/3 में सत्यापित करने की आवश्यकता नहीं है। उपयोगकर्ता जो भी कमरा शामिल करने का प्रयास कर रहा है उसके खिलाफ बस socket.assigns.user_id की जांच करें। फिर आप उस कमरे 'एंडपॉइंट.बॉडकास्ट "पर प्रसारित करते हैं: कमरे" 1 "," new_msg ",% {उपयोगकर्ता:" सिस्टम ", बॉडी:" आईईएक्स "} –
उत्तर के लिए धन्यवाद। तो हम केवल 'कमरे' अड्डों पर काम करते हैं। और मेरे स्रोत इस प्रकार होंगे: 'def में शामिल हों ("उपयोगकर्ता:" <> _uid, message, सॉकेट) अगर _uid == socket.assigns.user_id करें {: ठीक है, सॉकेट} अन्य {: त्रुटि,% { कारण: "अनधिकृत"}} अंत अंत ' – user1156168