Обновление Phoenix 1.4 - (FunctionClauseError) нет совпадений с функциональными предложениями в Phoenix.Socket .__ terminate __ / 2 - PullRequest
0 голосов
/ 04 февраля 2019

Я недавно обновил свое приложение Phoenix с 1.3 до 1.4.

Все замечательно, за исключением того, что когда я ухожу со страницы, я получаю следующую ошибку:

[error] GenServer #PID<0.509.0> terminating
** (FunctionClauseError) no function clause matching in Phoenix.Socket.__terminate__/2
    (phoenix) lib/phoenix/socket.ex:544: Phoenix.Socket.__terminate__({:shutdown, :closed}, %Phoenix.Socket{assigns: %{}, channel: MhrWeb.SearchChannel, channel_pid: #PID<0.509.0>, endpoint: MhrWeb.Endpoint, handler: MhrWeb.UserSocket, id: nil, join_ref: "2", joined: true, private: %{log_handle_in: :debug, log_join: :info}, pubsub_server: Mhr.PubSub, ref: nil, serializer: Phoenix.Socket.V2.JSONSerializer, topic: "search:query", transport: :websocket, transport_pid: #PID<0.497.0>})
    (stdlib) gen_server.erl:673: :gen_server.try_terminate/3
    (stdlib) gen_server.erl:858: :gen_server.terminate/10
    (stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
Last message: {:"$gen_cast", :close}
State: %Phoenix.Socket{assigns: %{}, channel: MhrWeb.SearchChannel, channel_pid: #PID<0.509.0>, endpoint: MhrWeb.Endpoint, handler: MhrWeb.UserSocket, id: nil, join_ref: "2", joined: true, private: %{log_handle_in: :debug, log_join: :info}, pubsub_server: Mhr.PubSub, ref: nil, serializer: Phoenix.Socket.V2.JSONSerializer, topic: "search:query", transport: :websocket, transport_pid: #PID<0.497.0>}

Я пытался реализовать terminate в user_socket.ex и search_channel.exкоторая занимается конкретными темами, но ничего не изменила.

Любое понимание очень ценится!

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Разобрался (это было глупо) ... в каждом из моих модулей канала мне нужно было удалить use Phoenix.Socket: /

0 голосов
/ 05 февраля 2019

Похоже, что есть несоответствие в сигнатуре функции \__terminate__ и том, что ей передается.

Из файла , оно ожидает поле :inverse_channels в вызове, котороеотсутствует в вашем вызове.

Поэтому, если вы попытаетесь добавить поле channel_inverse (вторая строка ниже) в ваш вызов (в iex), с примером PID в переменной pid0

Phoenix.Socket.__terminate__({:shutdown, :closed}, {
  %{channels_inverse: %{}}, # this is dummy data added!!

  %Phoenix.Socket{assigns: %{}, channel: MhrWeb.SearchChannel, 
    channel_pid: pid0, endpoint: MhrWeb.Endpoint, handler: MhrWeb.UserSocket, 
    id: nil, join_ref: "2", joined: true, private: %{log_handle_in: :debug, log_join: :info}, 
    pubsub_server: Mhr.PubSub, ref: nil, serializer: Phoenix.Socket.V2.JSONSerializer, 
    topic: "search:query", transport: :websocket, transport_pid: pid0}
})

ошибка предложения функции исчезает.

Итак, вам придется отслеживать, откуда поступает этот вызов функции без %{channels_inverse: %{}}.Может быть, ваши файлы javascript, связанные с сокетами, не обновлены до версии Phoenix 1.4?

...