问题标签 [phoenix-channels]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
183 浏览

elixir - 如何为数百个主题设置凤凰频道?

假设有一些用户,比如 100 个。每个用户有,比如 100 个项目,其中一部分由其他用户共享给用户。每个项目都有一个名称。

所以...我想要的是,如果我编辑 user1 的 item1 的名称,它应该更新所有拥有 item1 的用户。

我已经设置了必要的权限,并且 REST api 正在控制器上工作。

现在我想在phoenix中实现实时更新和频道是合适的。如果我有一个带有 topic 的频道item:*,我可以考虑所有用户的所有项目。

所以,如果有一个 user1 有 item1, item2, item3...., item100。我将如何在 javascript 端设置监听器?我认为这不是正确的方法吗?

有人可以帮我解决结构吗。谢谢!

更新:以下方法会起作用吗?

0 投票
1 回答
536 浏览

reactjs - 将远程客户端连接到 Phoenix 通道

我正在尝试将我的前端与 Phoenix 1.3 (localhost:4000) 分开,并且我正在 localhost:3000 上运行 React。

我终生无法与凤凰城联系。我得到错误:

我正在使用以下客户端:

我可以设法在终端中使用 wsta 进行连接,并且收到了很好的响应。我认为这可能是某种 CORS 问题,但我已经实现了cors_plugelixir 库,但我仍然遇到问题。有什么建议吗?

0 投票
1 回答
1084 浏览

sockets - 使用令牌和存在连接到 Phoenix Socket

我正在尝试将 Phoenix ChannelTokenPresence模块结合在一起,以向我的 Phoenix 1.3 应用程序添加聊天功能。我无法让所有 3 个模块一起工作。最后一个错误是connection to websocket closed before handshake. 现在,我没有收到任何错误,但它也没有连接到套接字。

我认为问题在于 player_socket.ex 中的“连接”功能。(我有一个播放器资源)。这是功能:

我正在 app.html.eex 的元标记中签署令牌。<%= tag :meta, name: "channel_token", content: Phoenix.Token.sign(@conn, "player auth", :player_id) %>

然后在 lobby_channel.ex 我尝试加入频道:

我阅读了文档,但似乎无法弄清楚为什么我无法使用“current_player”连接到 websocket,以便我可以使用 Presence 显示谁在线以及玩家的姓名与他们的聊天消息相关联。非常感谢任何见解!我在这里有回购: https ://github.com/EssenceOfChaos/gofish

更新

我正在使用“current_player”插件将播放器结构存储在 conn 中作为“current_player.

这是我更新后的 lobby_channel.ex:

0 投票
1 回答
156 浏览

elixir - 玩家 1 邀请玩家 2 与凤凰频道玩游戏

我正在使用 Phoenix 频道和 GenServer 在 Phoenix 创建一个有 2 名玩家的纸牌游戏。这是我的游戏结构的样子:

因此,如您所见,我将使用虚拟字段处理玩家手牌,然后将玩家和获胜者保存到数据库中。

我现在设置了一个大厅频道,玩家可以在这里聊天。我有一个没有功能的游戏频道。如何让玩家互相邀请玩游戏,接受或拒绝,然后让两个玩家一起进入游戏?

到目前为止,这是我在大厅频道中的内容(关于游戏):

我不知道我是否问对了问题。我正在尝试生成一个新的游戏 ID(来自 postgres),将两个玩家 ID 放入游戏中,然后让 GameServer 使用 GenServer 来管理玩家的手。

0 投票
1 回答
1200 浏览

websocket - 凤凰频道 [警告] 忽略不匹配的主题“主题:子主题” - 如何避免终端警告消息?

运行Phoenix Chat Example App时,localhost我们看到了这个“嘈杂”的警告:

[warn] Ignoring unmatched topic "topic:subtopic" in ChatWeb.UserSocket

警告忽略未处理的主题

code/phoenix-chat-example $ mix phx.server [info] Running ChatWeb.Endpoint with Cowboy using http://0.0.0.0:4000 09:50:37 - info: compiled 6 files into 2 files, copied 3 in 1.7 sec [warn] Ignoring unmatched topic "topic:subtopic" in ChatWeb.UserSocket [info] JOIN "chat_room:lobby" to ChatWeb.ChatRoomChannel Transport: Phoenix.Transports.WebSocket (2.0.0) Serializer: Phoenix.Transports.V2.WebSocketSerializer Parameters: %{} [info] Replied chat_room:lobby :ok [debug] QUERY OK source="messages" db=5.9ms decode=7.3ms SELECT m0."id", m0."message", m0."name", m0."inserted_at", m0."updated_at" FROM "messages" AS m0 [] [warn] Ignoring unmatched topic "topic:subtopic" in ChatWeb.UserSocket [warn] Ignoring unmatched topic "topic:subtopic" in ChatWeb.UserSocket [warn] Ignoring unmatched topic "topic:subtopic" in ChatWeb.UserSocket [warn] Ignoring unmatched topic "topic:subtopic" in ChatWeb.UserSocket [warn] Ignoring unmatched topic "topic:subtopic" in ChatWeb.UserSocket

当客户端打开时,警告只会无限期地记录在终端/控制台中......

尝试搜索 Google / GitHub / StackOverflow / Elixir 论坛......
但没有明显的解决方案......

如果知道如何删除此警告,分享!谢谢!

附加信息

  • 操作系统:OSX 10.13.2(最新)
  • 灵药v1.5.3:(最新
  • 凤凰:(v1.3.0当前/稳定
  • 终端:iTermv3.1.5
0 投票
1 回答
384 浏览

elixir - 在 UserSocket 上跟踪存在

我正在尝试跟踪用户在UserSocker使用时的存在,Phoenix.Presence而无需客户端出现在特定频道上。

稍后我想订阅用户在不同频道中的存在,以了解用户的存在。

我得到了这个工作,除了presence_diff在用户断开连接时收到一个。我正在做的是跟踪UserSocket每个用户的不同主题的存在:

在我的频道中,我订阅了用户不同的存在主题:

我得出的结论是,我需要以某种方式监视套接字transport_pid并在套接字终止时自己发送存在差异。

另一个想法是将客户端加入到UserSocket.connect/2功能之外的单独存在频道,但到目前为止我还没有找到如何存档它。

我将一个简单的凤凰应用程序与概述问题的测试一起破解:https ://github.com/kbredemeier/socket_presence

对此的任何建议将不胜感激。

0 投票
0 回答
360 浏览

websocket - 多人游戏 - Elixir 频道

我是 Elixir 的初学者。

我有一个多人游戏的长生不老药应用程序,它只是将接收到的命令复制到连接到通道的所有玩家。这是可行的,但在复制接收到的命令时会有一些延迟。消除延迟问题的最佳选择是什么?

为了将命令复制到连接到频道的所有播放器,我使用广播功能。这是最好的功能吗?

见以下代码:

0 投票
1 回答
113 浏览

ajax - 为未经身份验证的用户使用 phoenix 通道而不是 ajax 将是多么安全和惯用

一点上下文和用例:我有这个凤凰应用程序,它允许经过身份验证的用户在数据库中搜索,检索公共数据。未经身份验证的用户使用 ajax 调用和路由来触发控制器并发送回 json 响应以获得相同的结果。

以某种方式将未经身份验证的用户连接到私人频道是否可以作为客人或其他方式,以便我可以放弃 ajax 调用?你是如何在你的应用程序中解决这个问题的?

我像这样创建我的套接字连接:

socket = new Socket('/socket', {params: {guardian_token: app.guardian_token}})

如果可能,我应该注意什么?

谢谢

0 投票
1 回答
89 浏览

elixir - 忽略 MyApplication.UserSocket 中不匹配的主题“心跳”

这个问题似乎很基本,以至于我在教程或文档中绝对找不到任何关于它的信息。然而,如果我的客户 ping“心跳”(iOS 和 Android 客户端默认使用心跳)它就不起作用:[warn] Ignoring unmatched topic "heartbeat" in MyApplication.UserSocket

我觉得这段代码transport.ex应该简单地回显任何发送到心跳的请求,但不知何故它没有:

我是否错过了某处的配置?

我实现的所有其他功能都可以完美运行,因此我制作的所有频道都可以正常工作。

0 投票
1 回答
45 浏览

deployment - 一组机器上的 Phoenix 应用程序

我正在使用它的 Channel 和 Socket 模块开发一个实时 Phoenix 应用程序。该应用程序由几个进程和 GenServer 组成。我有一个用例,在一个事件(这是来自微服务的 API 调用)上,我需要以不同的时间戳将消息广播到我频道上的所有不同主题。我现在已经在本地机器上使用 Process.send_after(..) 实现了这一点。但我的疑问是:

在一组机器上,因为 API 调用只会命中集群中的一台机器,其他机器将无法发送广播消息。这会导致不准确。我怎样才能让所有的机器都知道这个特定的事件?还是我做错了?