问题标签 [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 回答
208 浏览

phoenix-framework - 如何在 elixir 中访问地图内的数据

我有使用 phoenix 框架编写的简单聊天应用程序。

我想访问套接字内的一些数据

这是我使用的方法

它将提供包含所有细节的漂亮地图。使用此方法获取所有房间(主题:“房间:Testuser”)的最佳方法是什么

这是控制台中显示的示例结果

0 投票
1 回答
1017 浏览

phoenix-framework - 何时在 Phoenix 频道中使用 {:noreply, socket} 与 {:reply, :ok, socket}?

我正在构建一个与 Phoenix 服务器进行实时通信的 Javascript 客户端应用程序,并且想知道是否收到了推送到服务器的消息。看起来 Phoenix 的 socket.js 希望我使用类似的东西:

但是,除非我将 Phoenix 应用程序上的返回值更改为 ,否则我无法触发此事件处理程序{:reply, :ok, socket},如下所示:

我想实际上并没有发送消息以响应客户端是有道理{:noreply, socket}的,但是在什么情况下您希望向服务器发送消息而不让它让您知道它有效?还是我误解了什么?我觉得对于普通的 HTTP 请求,您总是检查来自客户端的请求是否成功。

0 投票
1 回答
1397 浏览

phoenix-framework - 如何在凤凰框架聊天应用程序中向不同用户发送消息

我正在使用 phoenix 框架来创建不同类型的聊天应用程序。就我而言,我们有聊天室,但不能像普通的聊天室一样运作。

每个用户都有自己的房间,他可以使用不同的设备(移动设备、个人电脑、其他一些来源)加入自己的房间。

用户 A 有自己的房间,用户 B 有自己的房间,这两个成员不像现实世界中的正常场景那样连接到一个房间。

现在我的用户 A 想向用户 B 发送消息

消息数据,例如:

这是app.js我用来连接到用户特定房间的片段:

这是加入房间功能的后端片段
/web/channel/RoomChannel.ex

但现在我被困在中间,因为我找不到在用户之间发送消息的方法。例如:无法确定使用此特定场景将用户 A 的消息传递给用户 B 的方式

这是此聊天应用程序的基本架构师:

在此处输入图像描述

这是 Roomchannel 文件中的其余代码

谁能告诉我一些可以在用户聊天室之间传递消息的方法?

redis用来存储数据, 是我正在关注的基本聊天应用程序,感谢该开发人员。

0 投票
1 回答
260 浏览

sockets - 在后端订阅 Phoenix 频道(不是 channel.join())

是否可以将套接字订阅到后端而不是客户端的某些 Phoenix 频道?假设我有一些用户所属的组,并且我希望用户在建立 WS 连接后连接到它们。向用户发送组 ID 并加入频道似乎是不必要的往返,尤其是我想在一个回调中处理该组中的消息,所以我会onMessage在 Socket 上使用并通过掩码匹配。我该怎么做?

0 投票
0 回答
215 浏览

websocket - 在没有计时器延迟的情况下测试 Phoenix Channel Close 的 Elixir Monitor 进程?

我目前具有跟踪用户何时连接到频道以及用户何时离开频道的功能。这是从这里的 stackoverflow 答案实现的。

我编写了以下测试(参见 commit)来验证我的回调逻辑:

在没有延迟的情况下进行测试时,不会触发监视器回调。消除延迟后,我的测试断言失败,并且在测试完成后出现 GenServer 关闭错误:

有没有办法干净地测试我的功能而不会在我的测试用例中引入延迟?

0 投票
1 回答
578 浏览

reactjs - 如何在 Elixir Phoenix 中获取通道消息以更改 React 组件的状态?

我试图弄清楚如何根据外部事件来更新组件的状态,在这种情况下,外部事件是来自 Elixir Phoenix 频道的消息。

所以基本上,我有一个简单的 h1 标签,它必须始终反映进入频道的最新内容。所以有两个相互关联的问题:

a)如何将通道放入组件?到目前为止,我通过将通道作为道具传递来完成它。

b) 我如何处理进入组件内部通道的消息?我的“this.state.chan.on”不起作用,而且看起来很笨拙。

这样做的公认方式是什么?如何从通道或套接字或其他任何东西获取消息,在反应之外和用户界面之外生成,以影响组件的状态,以及相关的,我如何首先将外部事件通过管道传递到组件中?将通道放入组件中是否正确?因为这似乎也将通道的输出限制为仅影响该组件,而不是我可能希望它影响的其他独立组件。

编辑:这是编译错误消息。是的,我知道我的 JS 可能不正确,但我在第一个 this.state.chan.on 上就出现了语法错误:

0 投票
1 回答
1035 浏览

elixir - Elixir/Phoenix Endpoint 从另一个模块广播

我有一个频道,当你连接到它时,它会在后端做一些事情。后端作业完成后,我需要发回响应。这是我的频道:

Launcher模块是:

我希望先在前端接收%{total_reports: 541}test:my然后再%{total_reports: 5}boot:fetch前端接收。但我只接收来自boot:fetch而不是接收数据test:my

Endpoint.broadcastfromLauncher模块没有广播任何内容。这是预期的行为吗?为什么我不能从频道别名的模块广播?

此外,我已经测试过将完全相同的线路放入通道中,并且它可以工作。出于某种原因,我不能只使用其他模块来做到这一点。这个例子有效:

0 投票
1 回答
840 浏览

elixir - Elixir Phoenix Restful 到 websocket API

RESTful to websocket API 问题:我想启用一个与 websockets 接口的 RESTful api。

我有一些硬件与我的 Phx.server 保持 WS 连接,我想允许其他客户端通过 RESTful api 访问 phx.server 并与 WS 连接的硬件进行交互。

我没有弄清楚的部分是 RESTful 调用的响应,即 http 响应。假设我希望客户端能够从通过 WS 连接的硬件上的传感器请求当前温度。

我可以使用 Phoenix.Endpoint.broadcast(topic, event, msg) 通过控制器向 WS 广播,但我想“等待”响应,以便我可以在来自客户端的 HTTP 响应中发回 temp。任何建议表示赞赏。

0 投票
1 回答
264 浏览

elixir - Phoenix Presence 跨多个渠道跟踪用户

所以我想使用存在行为来跟踪每个用户的当前房间。问题是如果用户更改其当前房间,我不能/不知道如何更新 room_id。

def join("room:" <> room_id, auth_message, socket) do IO.puts "joining room:" <> room_id if authorized?(room_id, socket) do {:ok, assign(socket, :room_id, room_id)} else {:error, %{reason: "unauthorized"}} end end

当用户加入房间时,我传递了 room_id,然后我为他在房间之间切换时制作了这个处理程序:

问题是,对于他单击的每个房间,列表中都会有一个新条目,所以基本上他同时在所有这些房间中。我想要的是只在他离开时更新 room_id。

0 投票
0 回答
46 浏览

erlang - 仅连接到 1 个通道时,Elixir 重用通道功能

我有很多频道在做不同的事情,如下所示:

可能有 100 个。

每个人都从加入开始starting_channel。稍后我可以将套接字订阅到其他频道主题并相应地广播到不同的主题。但问题是我将无法重用handle_in这些渠道中的功能,因为用户实际上并没有首先加入它们。

例如,假设 room_channel 有这个处理程序:

show_room_happy_users但是由于您在通过发送消息时没有加入该频道,所以starting_channel什么都不会发生。

有没有办法在不同时加入所有频道的情况下实现这一目标?