【问题标题】:phoenix presence fetch/2 override凤凰存在 fetch/2 覆盖
【发布时间】:2017-09-17 19:14:15
【问题描述】:

我希望能够通过 :meta 映射在 phoenix 状态下传递用户元数据,以便从 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 个字段、电子邮件、密码和图标/头像图像的基本用户模型。

【问题讨论】:

  • 在文件顶部尝试require Ecto.Query。当我不需要该文件时,您的错误很典型。还要确保你已经导入了Ecto.Query
  • 编辑:不,这并没有改变错误代码。即使在需要 Ecto.Query 和我的用户模型之后,我仍然会收到 warning: variable "u" does not exist and is being expanded to "u()", please use parentheses to remove the ambiguity or change the variable name 作为主要警告和其他警告,如果我手动将其输入到 repl 中。
  • from 是一个 Ecto.Query 宏。您不必在控制器和模型中执行此操作,因为当您执行 use MyApp.Web, :controller 时,它已经在 web.ex 中设置。
  • 它与import Ecto.Query 合作。如果没有实际指定 from 似乎来自查询模块,则 require 不起作用。
  • 好的,我会发布一个答案,以便其他人可以看到它的答案

标签: elixir phoenix-framework phoenix-channels


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    您需要导入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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-03
      • 2016-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多