凤凰存在获取/ 2覆盖

时间:2017-04-20 23:41:17

标签: elixir phoenix-framework phoenix-channels

我希望能够通过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个字段,电子邮件,密码和图标/头像图像。

2 个答案:

答案 0 :(得分:1)

我发现了我的问题。基本上,我的应用程序中的metas映射并不总是填充我想要的值。在这种情况下,它内部始终没有user.id。显然,当用户加入频道时,fetch函数至少被调用4次。如果我在运行entries map之后检查了获取功能Map.keys,则会返回:

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

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

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

我将不得不从头开始重建这个应用程序,所以我想这意味着这个问题已经关闭。或者,我可以以保护或模式匹配语句的形式进行一些错误处理以防止这些空值,但我认为如果我重新启动它会更好。

答案 1 :(得分:0)

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

将以下内容添加到您的状态模块顶部,如下所示

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