2015-12-29 35 views
0

我正在關注編程Phoenix書籍,並且在嘗試連接到已認證的頻道時遇到服務器錯誤。錯誤是:user_socket.ex的Phoenix Channel - Erlang KeyError連接時

[error] Process #PID<0.1000.0> raised an exception ** (ErlangError) erlang error: [reason: %KeyError{key: :user_id, term: %{current_user: %Rumbl.User{__meta__: #Ecto.Schema.Metadata<:loaded>, annotations: #Ecto.Association.NotLoaded<association :annotations is not loaded>, id: 6, inserted_at: #Ecto.DateTime<2015-12-14T17:57:37Z>, name: "Joe", password: nil, password_hash: "$2b$12$TkUgAyJvSroft6KNhs8ECukFkrREZ/jS2xZUTLdp3oQuV.px22WrS", updated_at: #Ecto.DateTime<2015-12-14T17:57:37Z>, username: "joe", videos: #Ecto.Association.NotLoaded<association :videos is not loaded>}}}, mfa: {Phoenix.Endpoint.CowboyWebSocket, :init, 3}, stacktrace: [{Rumbl.UserSocket, :id, 1, [file: 'web/channels/user_socket.ex', line: 46]}, {Phoenix.Socket.Transport, :connect_vsn, 6, [file: 'lib/phoenix/socket/transport.ex', line: 154]}, {Phoenix.Transports.WebSocket, :init, 2, [file: 'lib/phoenix/transports/websocket.ex', line: 73]}, {Phoenix.Endpoint.CowboyWebSocket, :init, 3, [file: 'lib/phoenix/endpoint/cowboy_websocket.ex', line: 11]}, {:cowboy_handler, :handler_init, 4, [file: 'src/cowboy_handler.erl', line: 64]}, {:cowboy_protocol, :execute, 4, [file: 'src/cowboy_protocol.erl', line: 442]}], req: [socket: #Port<0.60203>, transport: :ranch_tcp, connection: :keepalive, pid: #PID<0.1000.0>, method: "GET", version: :"HTTP/1.1", peer: {{127, 0, 0, 1}, 49668}, host: "localhost", host_info: :undefined, port: 4000, path: "/socket/websocket", path_info: :undefined, qs: "token=g3QAAAACZAAEZGF0YWEGZAAGc2lnbmVkbgYA57J57lEB--NwLr3U3AgY8nAsNdr7Uya86zUrE%3D&vsn=1.0.0", qs_vals: :undefined, bindings: [], headers: [{"host", "localhost:4000"}, {"connection", "Upgrade"}, {"pragma", "no-cache"}, {"cache-control", "no-cache"}, {"upgrade", "websocket"}, {"origin", "http://localhost:4000"}, {"sec-websocket-version", "13"}, {"user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36"}, {"accept-encoding", "gzip, deflate, sdch"}, {"accept-language", "en-US,en;q=0.8"}, {"cookie", "SnapABugHistory=1#; _ga=GA1.1.577046204.1438865191; access_token=f4070d3a1906ebff569d311aa0ddd842c8ef30ee; user-hash=d569532a977f78e1d96d5bab3412a265; SnapABugVisit=86#1449075542; _rumbl_key=g3QAAAACbQAAAAtfY3NyZl90b2tlbm0AAAAYRUoxM1A2NnNNelRoSkR1TGxjaWM2UT09bQAAAAd1c2VyX2lkYQY=--P7j+4zmpEx4KRG4Eq5xZXruIM0Y="}, {"sec-websocket-key", "XjCnurWNHP47g1gcmQN5LA=="}, {"sec-websocket-extensions", "permessage-deflate; client_max_window_bits"}], p_headers: [{"connection", ["upgrade"]}], cookies: :undefined, meta: [], body_state: :waiting, buffer: "", multipart: :undefined, resp_compress: false, resp_state: :waiting, resp_headers: [], resp_body: "", onresponse: :undefined], opts: {Phoenix.Transports.WebSocket, {Rumbl.Endpoint, Rumbl.UserSocket, :websocket}}] (cowboy) src/cowboy_protocol.erl:442: :cowboy_protocol.execute/4 [error] Ranch protocol #PID<0.1000.0> (:cowboy_protocol) of listener Rumbl.Endpoint.HTTP terminated ** (exit) an exception was raised: ** (ErlangError) erlang error: [reason: %KeyError{key: :user_id, term: %{current_user: %Rumbl.User{__meta__: #Ecto.Schema.Metadata<:loaded>, annotations: #Ecto.Association.NotLoaded<association :annotations is not loaded>, id: 6, inserted_at: #Ecto.DateTime<2015-12-14T17:57:37Z>, name: "Joe", password: nil, password_hash: "$2b$12$TkUgAyJvSroft6KNhs8ECukFkrREZ/jS2xZUTLdp3oQuV.px22WrS", updated_at: #Ecto.DateTime<2015-12-14T17:57:37Z>, username: "joe", videos: #Ecto.Association.NotLoaded<association :videos is not loaded>}}}, mfa: {Phoenix.Endpoint.CowboyWebSocket, :init, 3}, stacktrace: [{Rumbl.UserSocket, :id, 1, [file: 'web/channels/user_socket.ex', line: 46]}, {Phoenix.Socket.Transport, :connect_vsn, 6, [file: 'lib/phoenix/socket/transport.ex', line: 154]}, {Phoenix.Transports.WebSocket, :init, 2, [file: 'lib/phoenix/transports/websocket.ex', line: 73]}, {Phoenix.Endpoint.CowboyWebSocket, :init, 3, [file: 'lib/phoenix/endpoint/cowboy_websocket.ex', line: 11]}, {:cowboy_handler, :handler_init, 4, [file: 'src/cowboy_handler.erl', line: 64]}, {:cowboy_protocol, :execute, 4, [file: 'src/cowboy_protocol.erl', line: 442]}], req: [socket: #Port<0.60203>, transport: :ranch_tcp, connection: :keepalive, pid: #PID<0.1000.0>, method: "GET", version: :"HTTP/1.1", peer: {{127, 0, 0, 1}, 49668}, host: "localhost", host_info: :undefined, port: 4000, path: "/socket/websocket", path_info: :undefined, qs: "token=g3QAAAACZAAEZGF0YWEGZAAGc2lnbmVkbgYA57J57lEB--NwLr3U3AgY8nAsNdr7Uya86zUrE%3D&vsn=1.0.0", qs_vals: :undefined, bindings: [], headers: [{"host", "localhost:4000"}, {"connection", "Upgrade"}, {"pragma", "no-cache"}, {"cache-control", "no-cache"}, {"upgrade", "websocket"}, {"origin", "http://localhost:4000"}, {"sec-websocket-version", "13"}, {"user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36"}, {"accept-encoding", "gzip, deflate, sdch"}, {"accept-language", "en-US,en;q=0.8"}, {"cookie", "SnapABugHistory=1#; _ga=GA1.1.577046204.1438865191; access_token=f4070d3a1906ebff569d311aa0ddd842c8ef30ee; user-hash=d569532a977f78e1d96d5bab3412a265; SnapABugVisit=86#1449075542; _rumbl_key=g3QAAAACbQAAAAtfY3NyZl90b2tlbm0AAAAYRUoxM1A2NnNNelRoSkR1TGxjaWM2UT09bQAAAAd1c2VyX2lkYQY=--P7j+4zmpEx4KRG4Eq5xZXruIM0Y="}, {"sec-websocket-key", "XjCnurWNHP47g1gcmQN5LA=="}, {"sec-websocket-extensions", "permessage-deflate; client_max_window_bits"}], p_headers: [{"connection", ["upgrade"]}], cookies: :undefined, meta: [], body_state: :waiting, buffer: "", multipart: :undefined, resp_compress: false, resp_state: :waiting, resp_headers: [], resp_body: "", onresponse: :undefined], opts: {Phoenix.Transports.WebSocket, {Rumbl.Endpoint, Rumbl.UserSocket, :websocket}}] (cowboy) src/cowboy_protocol.erl:442: :cowboy_protocol.execute/4

線46:

def id(socket), do: "users_socket:#{socket.assigns.user_id}" 

缺少什麼我在這裏?謝謝!

+0

哎喲,此錯誤消息看起來並不友好的。你能告訴我你的Phoenix和Elixir版本嗎? –

+0

@JoséValim,下面的答案回答了我的問題。不幸的是,我已經升級到最新的仙丹和鳳凰,所以我不記得哪個確切版本產生了這個錯誤。我認爲它是靈丹妙藥1.1和鳳凰1.0。 – austinsmorris

+0

不用擔心,無論如何我都能解決這個問題:) –

回答

1

這已被報告爲勘誤here,所以我相信它會在本書的最終修訂版中得到修復。要解決此問題,更改:

def id(socket), do: "users_socket:#{socket.assigns.user_id}"

到:

def id(socket), do: "users_socket:#{socket.assigns.current_user.id}"

爲什麼你收到此錯誤

UserSocketconnect/2,如果用戶進行身份驗證,您正在將current_user分配給插座中的user,而不是user_id

{:ok, assign(socket, :current_user, user)}

所以socket沒有user_id關鍵。當你調用一個不映射中存在一個關鍵的KeyError引發錯誤:

enter image description here