问题标签 [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 投票
3 回答
1227 浏览

elixir - 如何在 channelcase phoenix 框架测试中清除邮箱

我正在做一个接收大量消息的通道测试。我可能会在设置过程中收到一条消息,调整一些状态,然后我想assert(或refute)发送该消息的另一个副本。我想我可以通过在引发将触发第二条消息的事件之前清除邮箱来做到这一点。如何清空channelcase邮箱?

编辑,我已经通过assert_push所有旧邮件完成了我的需求,这将它们从邮箱中清除了。这工作得很好,但如果消息多于几条,就会非常不方便

0 投票
1 回答
464 浏览

websocket - 多租户凤凰频道

过去,我实现了多租户系统并使用请求主机标头在租户之间隔离用户。我的第一个想法是采用相同的方法,但使用 websockets,但我遇到了几个问题:

1)主机头似乎不可用

2)主题ID和频道之间存在一对一的关系,即如果两个不同的客户端从不同的租户连接到相同的主题(例如messages:lobby),那么他们将收到任何用于其他租户的消息。

我已经能够通过在 websocket 连接字符串中包含一个标识租户的查询参数来解决 (1)。(2)是事情有点不清楚的地方。我可以命名主题以包含租户的标识符,例如tenant1:messages:123,但是现在主题中有两个变量,因此您无法匹配类似tenant_id <> ":messages:" <> message_id. 你可以用一个函数来解决这个问题,但是有很多样板文件。

多租户 websocket 有更好的策略吗?

0 投票
0 回答
558 浏览

elixir - 重新加载后重复加入频道

我在我的项目中使用 Phoenix Channels 分配颜色,但我不断收到这样的错误:

如何复制:

  1. 进行安装 && 进行构建
  2. 混合凤凰服务器
  3. 加载网页一次,一切正常
  4. 重新加载和新的颜色按钮停止工作,上面的消息出现在控制台中..

代码:

后端

正面:

回购:

  1. 正面
  2. 后端
0 投票
3 回答
3961 浏览

sockets - Phoenix Channels - 每个插槽有多个通道

我正在编写一个使用 Elixir Channels 来处理实时事件的应用程序。我知道每个客户端将打开 1 个套接字,并且可以在其上多路复用多个通道。所以我的应用程序是一个聊天应用程序,其中用户是多个群聊的一部分。我有 1 个名为 MessageChannel 的 Phoenix Channel,其中 join 方法将处理动态主题。

假设 John 加入了组/主题 A 和 B,而 Bob 只加入了组/主题 B。当 john 向组/主题 A 发送消息时,broadcast!/3也会将该消息发送给 Bob 是否正确?因为handle_in没有消息发送到哪个主题/组的上下文。

我将如何处理它,以使 Bob 不会收到发送到 A 组的事件。我的设计是否正确?

0 投票
0 回答
491 浏览

elixir - 如何使用 Phoenix.ChannelTest.close/2 测试频道

我有一个启动套接字连接并订阅和加入主题的测试。然后我将一条消息推送到通道,该通道执行一些工作并保留一些数据。然后我在模拟客户端关闭连接的套接字上使用 ChannelTest.close/2。然后我想修改操纵的数据并创建另一个套接字连接来测试一些行为。

我的问题是 ChannelTest.close/2 导致我的测试失败并返回** (EXIT from #PID<0.558.0>) shutdown: :closed。我怎样才能防止这种情况发生?

这是一些相关的代码

按照评论中链接的答案,我添加了一些代码:

现在我收到一条不同的错误消息:** (exit) exited in: GenServer.call(PlexServer.EmpireSupervisor, {:terminate_child, :empire4}, :infinity) ** (EXIT) no process

0 投票
0 回答
104 浏览

phoenix-framework - Phoenix Presence:迭代连接的用户以响应事件?

假设我有一个包含实时数据仪表板的 Phoenix 应用程序。

我有一个名为 的频道MyApp.DashboardChannel,只有一个主题dashboard

MyApp.DashboardChannel中,我有一个类似的功能:

每当发生更改仪表板中显示的数据的事情时,我都可以调用此函数来推出更新的版本。例如,在MyApp.TransactionController.create保存交易后,我可以调用DashboardChannel.send_update以便每个人都可以看到新的交易。

现在,假设我想修改它,以便每个仪表板用户都获得自定义数据。本质上我想说的是:“对于每个连接的用户,使用他们运行查询user_id并将结果数据推送给他们。”

我怎样才能做到这一点?

我很确定答案将涉及Phoenix.Presence. 我已经将它添加为文档显示,并且成功地在浏览器中获取presence_statepresence_diff事件。

然而:

  • Presence.list(socket)调用时我不能使用send_update,因为我是从无法访问的控制器调用它socket
  • 当我打电话时,Presence.list(MyApp.DashboardChannel, "dashboard")我得到一个** (EXIT) no processfrom GenServer。我是否误解了如何使用它?
0 投票
0 回答
855 浏览

elixir - Phoenix - 连接套接字、加入频道、推送、接收来自另一个应用程序的消息

出于学习目的,我创建了这个简单的 TODO 应用程序,它使用 Phoenix Channels 而不是控制器到 CRUDliststodos
https
://chandothis.herokuapp.com/ 代码在这里:
https ://github.com/iacobson/chan_do_this

现在我想继续实验并将频道消息从不同的 Phoenix(甚至只是 Elixir)应用程序发送到现有的 Heroku 应用程序,假设创建一个新列表。但是在这里我遇到了麻烦。

连接到 Heroku 套接字的方法是什么?(wss://chandothis.herokuapp.com/socket/websocket?token=undefined&vsn=1.0.0) 并加入频道"lists"

更新 1
尝试使用 elixir_socket ( https://github.com/meh/elixir-socket )
{:ok, socket} = Socket.connect("wss://chandothis.herokuapp.com/socket/websocket")

{:ok, %Socket.Web{extensions: nil, headers: %{}, key: "Zm9yayB0aGUgZG9uZ2xlcw==", mask: true, origin: nil, path: "/socket/websocket", protocols: nil, socket: {:sslsocket, {:gen_tcp, #Port<0.7049>, :tls_connection, :undefined}, #PID<0.372.0>}, version: 13}}

{_, _, pid} = socket.socket

send pid, {:send, %{topic: "phoenix", event: "phx_join", payload: %{}}}

但得到这个:

[info] [83, 83, 76, 58, 32, 71, 111, 116, 32, 117, 110, 101, 120, 112, 101, 99, 116, 101, 100, 32, 105, 110, 102, 111, 58, 32, [123, [[123, ['send', 44, [35, 123, [['event', ' => ', [60, 60, '"phx_join"', 62, 62]], 44, 10, [' ', [' ', 32, 32, 32], 32, [32, [' ', 32, 32, ...], ' ', 32, 32, ...], 32, [' ', 32, 32, ...], ' ', 32, 32, ...], ['payload', ' => ', '\#{}'], 44, 10, [' ', [' ', 32, 32, ...], 32, [32, ...], 32, ...], ['topic', ' => ', [60, 60, '"phoenix"', ...]]], 125]], 125], 44, 10, [32, [32, [' ', 32, 32, 32], ' ', 32, 32, 32], 32, [' ', 32, 32, 32], ' ', 32, 32, 32], 'tcp_error', 44, '#Port<0.7049>'], 125], 32, '\n']

更新 2 Erlang websocket_client ( https://github.com/sanmiguel/websocket_client )的
另一个尝试, 并使用以下示例:https://github.com/phoenixframework/phoenix/blob/master/test/support/websocket_client.exs

{:ok, socket} = Phx.WebsocketClient.start_link(self(), "wss://chandothis.herokuapp.com/socket/websocket?token=undefined&vsn=1.0.0")
Phx.WebsocketClient.join(socket, "lists", %{})
收到以下错误:

[error] State machine #PID<0.391.0> terminating Last message in was {:send, %{event: "phx_join", payload: %{}, ref: "1", topic: "lists"}} When State == :disconnected Data == {:context, {:websocket_req, :wss, 'chandothis.herokuapp.com', 443, '/socket/webs`enter code here`ocket?token=undefined&vsn=1.0.0', :infinity, :undefined, 1, :undefined, {:transport, :ssl, :ssl, :ssl_closed, :ssl_error, [mode: :binary, active: true, verify: :verify_none, packet: 0]}, "mR8BigxTXTlwBgxhiE63gA==", :undefined, :undefined, :undefined, :undefined, :undefined}, {:transport, :ssl, :ssl, :ssl_closed, :ssl_error, [mode: :binary, active: true, verify: :verify_none, packet: 0]}, [], {:wss, 'chandothis.herokuapp.com', 443, '/socket/websocket?token=undefined&vsn=1.0.0'}, {Phx.WebsocketClient, %{ref: 1, sender: #PID<0.384.0>}}, "", false, 0} Reason for termination = {:error, :disconnected}

0 投票
0 回答
70 浏览

security - socket.assets 在凤凰框架中安全吗?

客户端(例如 Phoenix Channels JavaScript 客户端)可以从 socket.assigns 读取或写入数据吗?默认情况下,服务器是否对这些数据进行签名或加密?

更具体地说,这里是服务器代码片段:

客户端代码:

客户端是否可以读取 1234 或将其更改为任何其他值?

非常感谢您的帮助!

0 投票
0 回答
51 浏览

elixir - 优雅地将数据从动作传递到通道

如何在 PhoenixAction中传递数据。Channel

假设我们有控制器Controller和通道Channel,如何将数据从Actionin发送Controller到相应的Channel连接。

"solutions"我们想出的是丑陋的,我们曾经通过将其注入 .js 文件(黑客马拉松)来做到这一点,但这很丑陋。我在考虑是否可以通过会话传递它,因为第一个请求WS是获取请求,但我还没有找到合适的解决方案。

考虑身份验证示例。您通过 oauth 回调获取数据,并希望将其传递给同一用户,但在特定通道上的套接字连接上。

问题是数据是通过回调获取的。假设数据是秘密的。我希望它用于特定通道的套接字连接

  1. 从回调(控制器)中获取数据
  2. 做我不知道的事
  3. 使用来自回调的数据加入频道(频道)

任何想法如何正确地做到这一点?

0 投票
1 回答
93 浏览

elixir - 如何实时更新按钮的颜色?

我有一个索引页面,当用户登录时,它会显示数据库中的所有表(表的按钮)。表可以有一个顺序。因此,它的工作原理就像当用户单击表格时,它会重定向到订单的创建路径并创建订单。或者,如果一个表有订单,它会重定向到订单显示页面。每个订单都有一个 table_id。表格通过显示不同的颜色来显示现在是否忙碌。

我想做的是实时更改表格按钮的颜色。因此,如果一个用户创建订单,其他用户可以在表格更改颜色时立即看到它。我怎样才能做到这一点?我正在研究 gen server 和 channel 但我仍然不熟悉这些概念.. 对此有什么建议吗?

提前致谢