Elixir phoenix存在获取/2覆盖

Elixir phoenix存在获取/2覆盖,elixir,phoenix-framework,phoenix-channels,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),

我希望能够在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
def fetch(_主题,条目)do
质疑=
从用户中的u,
其中:u.id在^Map.key(条目)中,
选择:{u.id,u}
users=query |>Repo.all |>Enum.into(%{})

对于{key,%%{metas:metas}}您需要导入
exto.Query
以使用
from
宏。这是在你的
web.ex
文件中完成的,因此当你
使用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次。如果在其上运行
map.keys
后检查fetch函数的
条目映射
,它将返回:

["1"]
["1"]
[]
[]
因此,基本上,在调用fetch函数的四个实例中,有两个实例中,我的channel app为键返回了两个空值,当这些空值被放入查询时,它会导致一个错误

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


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

尝试在文件顶部的
require-exto.Query
。当我不需要该文件时,您的错误是典型的。另外,请确保已导入未更改错误代码的
exto.Query
Edit:naw。我仍然收到
警告:变量“u”不存在,并且正在扩展为“u()”,请使用括号消除歧义,或者将变量名
更改为主警告,如果我手动将其键入repl,请将其更改为其他警告,即使在要求使用exto.Query和我的用户模型之后也是如此。
from
是一个exto.Query宏。您不必在控制器和模型中执行此操作,因为当您使用MyApp.web时,它已经在web.ex中设置好了,例如:controller
。它使用的是
import-exto.Query
。require不适用于out实际指定from似乎是来自查询模块。好的,我将发布一个答案,以便其他人可以看到它的答案