凤凰存在 fetch/2 覆盖

phoenix presence fetch/2 override

我希望能够通过 phoenix presence 中的 :meta 地图传递用户元数据,以便从 JavaScript 端访问它。更具体地说,我希望能够推送图像文件路径(字符串)并将它们与我的存在列表中的每个用户相关联。文档给出了这个例子,用于覆盖 fetch/2 函数以将用户模型数据添加到 :meta 映射中:

def fetch(_topic, entries) do
  query =
    from u in User,
      where: u.id in ^Map.keys(entries),
      select: {u.id, u}

  users = query |> Repo.all |> Enum.into(%{})

  for {key, %{metas: metas}} <- entries, into: %{} do
    {key, %{metas: metas, user: users[key]}}
  end
end

但是,当我对我的用户模型进行适当的更改时,我收到有关变量 u 和 from/2 函数以及 cannot use ^Map.keys(entries) outside of match clauses 的错误。

我一直在寻找人们尝试做类似事情的例子,但在 github 上找不到任何与我在这里尝试的类似的东西。

任何人都知道我该如何重构 fetch/2 函数以使其正常工作?我有一个包含 3 个字段、电子邮件、密码和 icon/avatar 图像的基本用户模型。

您需要导入 Ecto.Query 才能使用 from 宏。这是在您的 web.ex 文件中完成的,因此当您 use MyApp.Web, :controller 时,您可以通过 web.ex 中的 quote 块导入它。但是,您需要在其他模块中手动执行此操作。

像这样将以下内容添加到状态模块的顶部

defmodule MyApp.Presence do
  use Phoenix.Presence, otp_app: :my_app,
                        pubsub_server: MyApp.PubSub
  import Ecto.Query
  # ...
end

我发现我的问题是什么。基本上,我的应用程序中的 metas 地图并不总是填充我想要的值。在这种情况下,它并不总是包含 user.id 。显然,当用户加入频道时,fetch 函数至少被调用了 4 次。如果我在 运行ning Map.keys 之后检查 fetch 函数的 entries map,它 returns:

["1"]
["1"]
[]
[]

所以基本上在调用 fetch 函数的四个实例中的两个实例中,我的频道应用程序为键返回 2 个空值,当将这些空值放入查询时会导致错误。

不幸的是,这意味着应用程序中的其他地方存在错误,导致将此空值传递给我的获取函数;最有可能在 JavaScript 或我的频道模块中。

我将不得不从头开始重建这个应用程序,所以我想这意味着这个问题已经结束了。或者,我可以以保护或模式匹配语句的形式加入一些错误处理来防止出现这些空值,但我认为如果我只是重新启动,在 long 运行 中会更好。