【问题标题】:Phoenix 1.4 Upgrade - (FunctionClauseError) no function clause matching in Phoenix.Socket.__terminate__/2Phoenix 1.4 升级 - (FunctionClauseError) Phoenix.Socket.__terminate__/2 中没有函数子句匹配
【发布时间】:2019-06-27 16:43:56
【问题描述】:

我最近将我的 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>}

我尝试在 user_socket.ex 和 search_channel.ex 中实现终止,它处理特定主题,但它没有改变任何东西。

非常感谢任何见解!

【问题讨论】:

  • 什么是 Elixir 版本?什么是 OTP 版本?
  • 另外,我会从mix deps.clean 甚至rm -rf _build deps 开始。
  • 感谢您的回复... Erlang/OTP 21 [erts-10.2.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [dtrace] Elixir 1.8.0(使用 Erlang/OTP 21 编译)
  • @AlekseiMatiushkin 您的建议不走运...仍然遇到同样的错误。

标签: elixir phoenix-framework phoenix-channels


【解决方案1】:

看起来\__terminate__ 函数签名与传递给它的内容不匹配。

the file 开始,它需要调用中缺少的:inverse_channels 字段。

因此,如果您尝试在调用中(在 iex 中)添加一个 channels_inverse(下面的第二行)字段,并在 pid0 变量中添加一个示例 PID

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: %{}} 的函数调用来自何处。可能你的socket相关的javascript文件没有更新到phoenix 1.4?

【讨论】:

  • 感谢您的回复...肯定给了我更多调查。
【解决方案2】:

想通了(这很愚蠢)...在我需要删除的每个频道模块中 use Phoenix.Socket :/

【讨论】:

    猜你喜欢
    • 2019-06-15
    • 2019-09-24
    • 2021-01-22
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多