Deathslice246
Always get that my join/3 function is undefined(join crash). What am I missing?
I have these two channels: UserChannel and PrivateChannel. UserChannel is the user’s own lobby and an example of joining that channel is user:3 where 3 is the user’s id. An example of joining private channel is private:3:23 where 3 is the id of the first user and 23 is the id of the second user.
The series of events that a user would take is as follows: In the client side when the user login, I create the socket and send in the user’s id as the socket’s param and try to connect to the UserChannel; this occurs successfully. When the user wants to initiate a private chat, they search by name and a series of profiles appear. Once they click on it, a function called startPrivateChat fires and calls the connectToPrivateChat defined in my chat.js. What happens is that I get a join crash because my join/3 function in App.PrivateChannel is undefined.
Now in the phoenix documentation and from multiple other sources, they say that all I need is one socket and I can use that socket to multiplex to different channels. So what I did is create a chat.js service that references things like the socket, the two channels(this.user_channel and this.private_channel) and another methods like connectToSocket, connectToUserChannel, connectToPrivateChannel etc. So why is this happening and what exactly am I doing wrong?
P.S - I’m using Phoenix 1.2 and Elixir 1.6.5
user_socket.ex
defmodule AppChat.UserSocket do
use Phoenix.Socket
channel "user:*", AppChat.UserChannel
channel "private:*", AppChat.PrivateChannel
transport :websocket, Phoenix.Transports.WebSocket
def connect(%{ "user_id" => id }, socket) do
current_user = AppChat.Repo.get(AppChat.User, String.to_integer(id))
{:ok, assign(socket, :current_user, current_user)}
end
def id(socket), do: "user_socket:#{socket.assigns.current_user.id}"
end
user_channel.ex
defmodule AppChat.UserChannel do
use AppChat.Web, :channel
require Logger
def join("user:" <> user_id, _payload, socket) do
if socket.assigns.current_user.id == String.to_integer(user_id) do
{:ok, socket}
else
{:error, %{reason: "unauthorized"}}
end
end
end
private_channel.ex
defmodule AppChat.PrivateChannel do
use AppChat.Web, :channel
require Logger
def join("private:" <> users_string, _payload, socket) do
if users_string |> String.split(":") |> Enum.member?(socket.assigns.current_user.id) do
{:ok, %{}, socket}
else
{:error, %{reason: "unauthorized"}}
end
end
end
Most Liked
kokolegorille
This will never be true, because id is an Int, while the list contains Strings.
It would be nice to see the join crash error log. I guess it might be js crashing, not channels crashing.
chrismccord
Phoenix 1.2 vs 1.3 isn’t a problem here. While we added AppWeb naming, it’s just a module name. What the elixir stack trace is telling us is that AppChat.PrivateChannel does not exist. From your provided snippets, the user socket channel matches the defmodule AppChat.PrivateChannel, but is it possible you renamed these in your example? Can you include your, current, exact, user_socket.ex and private_channel.ex, along with a current elixir stack trace? Thanks!
Deathslice246
Ok, I’ll make an example on github and post it here shortly.
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance









