2

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

4

2 回答 2

1

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

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

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

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

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

于 2017-04-21T22:35:07.563 回答
0

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

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

defmodule MyApp.Presence do
  use Phoenix.Presence, otp_app: :my_app,
                        pubsub_server: MyApp.PubSub
  import Ecto.Query
  # ...
end
于 2017-04-21T03:05:46.170 回答