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

phoenix-framework - 如何检测当前主题?

我将在哪里存储主题 ID?

至于套接字,我可以使用:

那是在套接字范围内,但是我的用户可以同时加入多个主题,这意味着每次加入新主题时,上面的代码都会覆盖 topic_id,是这样吗?

如果我想知道哪个主题 ID 在 中处于活动状态handle_in怎么办?

例如:

我虽然这样:

还有另一种方法可以做到这一点吗?或者这就是它的完成方式?

0 投票
1 回答
487 浏览

elixir - Phoenix - 将 Ecto 查询结果返回给特定客户端

我目前正在尝试设计一个发生以下情况的方案。

客户端A已订阅/连接到 topic/channel T

Aselect以查询的形式向 发送消息T

A接收查询结果,不接收其他订阅者。

这甚至可以使用频道吗?我选择 Channels 的主要原因是出色的 websocket 支持 - 但是我对其他 Phoenix 解决方案持开放态度。

0 投票
2 回答
1128 浏览

phoenix-framework - 如何使用 Phoenix.Channel.reply/2 异步回复频道推送

我正在尝试将 Phoenix 文档中的Phoenix.Channel.reply/2示例扩展为异步回复 Phoenix 通道/套接字推送事件的完整工作示例:

取自https://hexdocs.pm/phoenix/Phoenix.Channel.html#reply/2

我对示例进行了如下修改:

room_channels.ex

工人.ex

该解决方案有效,但它不依赖于socket_ref(socket)Phoenix.Channel.reply/2上生成和传递 socket_ref 。相反,它依赖于Phoenix.Channel.broadcast/3

该文档暗示,reply/2专门用于这种异步回复套接字推送事件的场景:

回复(arg1,arg2)

异步回复套接字推送。

当您需要回复无法使用 {:reply, {status, payload}, socket} 从您的 handle_in 回调返回的推送时很有用。reply/3 将用于极少数情况下,您需要在另一个进程中执行工作,并在完成时通过使用 socket_ref/1 生成对推送的引用来回复。

当我生成并传递一个 socket_ref,并依靠Phoenix.Channel.reply/2对套接字推送进行异步回复时,我根本无法让它工作:

room_channels.ex

工人.ex

我的 room_channels.exhandle_info函数被调用,但reply/2似乎没有通过套接字发送消息。我看不到 stderr 上的堆栈跟踪或 stdout 上的任何输出以指示错误。更重要的是,跟踪 socket_ref 似乎只会给我的代码增加开销。

与我的广播/3解决方案相比,使用 socket_ref 和回复/2有什么好处?如何使回复/2的解决方案正常工作?

0 投票
1 回答
518 浏览

ios - 无法使用 PhoenixWebSocket 从 iOS 连接到托管在 Heroku 上的 Phoenix 频道

我已经将 Phoenix 应用程序推送到 Heroku 并且运行良好,除了从 iOS 连接到频道。

浏览器上的频道按预期工作。

在 iOS 中,我使用的是PhoenixWebSocket,在开发环境中,连接到本地 Phoenix 应用程序按预期工作。

我遇到的问题是,当我将 web socket url 指向 Heroku 应用程序时,我收到以下错误:

今天早些时候四处寻找错误消息,我发现了 Chris McCord 的一个帖子,我认为是,说这个错误消息是服务器拒绝升级请求的结果。

但是,我环顾 Heroku 并发现了这一点;所有应用程序都支持 Websockets 功能

所以我很困惑我的问题是在 iOS 端还是 Heroku 端。

我已将 Chris 的示例聊天应用程序推送到 Heroku,并尝试连接 PhoenixWebSocket 附带的演示应用程序,但得到相同的错误。

有没有其他人设法让 Web 套接字请求在 iOS 和托管 Phoenix 应用程序的 Heroku 之间工作?

有人知道在尝试加入频道之前我是否需要对 iOS 中的请求做一些不同的事情吗?或者,也许 Heroku 设置与我错过的 Web 套接字有关?

iOS中请求的url:

非常感谢任何可以提供帮助的人,如果还有什么我可以提供的帮助,请告诉我。

保罗

0 投票
0 回答
169 浏览

phoenix-framework - 在凤凰频道上发送模板部分作为消息

使用通道发送部分模板是一个坏主意吗?

另一种选择是发送 JSON 并在 javascript 和 eex 上有一个重复的模板。

我问这个是因为我不知道通道内部,它可能有消息大小限制或其他一些缺点。

以下是保存帖子后我将其发送到控制器的方式:

0 投票
0 回答
446 浏览

twitter - 如何从 spawn 函数创建 GenServer 子进程?

我正在使用ExTwitter Stream实时跟踪推文并通过频道端点广播它们。我想为每个事件创建一个进程并为其分配一个 twitter 流侦听器,然后当新订阅者加入同一事件时获取先前的流状态并接收和广播新的推文。

如何从以下位置创建 GenServer 进程:

并在以下模块中通过 event_id 将其分配为子项:

如何在事件监视器之外接收新推文或最终停止推特流?

导师:

0 投票
1 回答
3991 浏览

nginx - How to set up Websockets with Phoenix behind Nginx?

I'm trying to set up web sockets to go through Nginx to a Phoenix app but keep getting a 403 error. Can anyone advise the correct configuration to make this work in production - development env is fine.

My Nginx conf:

My prod.exs conf:

I can provide any additional info as requested if necessary.

The app can be reached fine over the domain name, the last and only remaining problem is getting web sockets to work.

Many thanks to anyone who can point me in the right direction.

0 投票
1 回答
1350 浏览

jquery - 凤凰频道从项目外的客户发送消息

我想向我的 Phoenix 应用程序的用户频道发送消息。我已经加入了一个 user_token 与频道,users:user_tokenuser_channel.ex. toy_controller我通过调用广播方法从另一个名为 the 的控制器成功地做到了这一点。广播方式在用户频道。我已经编写了一个 jQuery 文件来处理这些事件。我一直在寻找可以从项目外部向同一频道发送消息的东西,因为我想做一些物联网的事情。我尝试了一个名为的 python 模块occamy.socket和它在内部使用的 Phoenix 的 JS 客户端。然后,我发现总是断线。我无法弄清楚 Phoenix 的 websocket 连接的确切地址。如果我在该项目文件夹本身中使用 Phoenix npm 库进行尝试,它会说ReferenceError: window is not defined总是。而且,我认为这是因为文件中套接字的初始化部分web/static/js/socket.js写为

,但我不确定。我尝试过的东西如下

在 python 客户端中,我也尝试连接到该地址,但出现断开连接错误。我想为物联网目的做这件事,我想监控用户的传感器数据。每个用户都将拥有自己的传感器进行监控。因此,我已将频道topic:subtopic频道配置为users:user_token. 我需要使用用户的那些独特令牌将消息从我的树莓派发送到这个频道。下面给出了我的 user_channel、user.js、app.js 和 socket.js。

0 投票
1 回答
876 浏览

elixir - Phoenix Channels - 从控制器广播 - 如何找到 current_user?

我有一个应用程序,我在 submit_controller 中广播了一些表单提交,如下所示:

但是,我现在尝试做的是确保只有 current_user 才能访问为其表单广播的提交。(例如,如果表单 2 属于另一个用户,current_user 将无法查看“forms:2”的提交)。

join通过仅过滤我在连接操作中分配给通道的用户 ID 的表单来设法在通道操作中执行此操作:

但是对于broadcast我没有socket可用的。

我的问题:

  1. 有没有办法通过频道主题以某种方式找到套接字?就像是:

    /li>

之后我可以看看是否user_id == submission.user_id,如果为真则广播

  1. 如果这是不可能的,那么最好的做法是什么,并确保只有 current_user 可以访问他们的表单提交?
0 投票
2 回答
1150 浏览

sockets - 广播到不同频道 Phoenix 1.1.6

我正在尝试在我的应用程序中广播到不同的频道,但我无法让它工作。我也想写一个测试,但我不知道怎么做。

据我所知,我成功地从 notification_channel 广播了消息,但在 chat_channel 中没有收到。

通知应该发送到聊天。

notification_channel.ex

聊天频道.ex

测试

reply 该测试通过,我可以通过更改或注释掉广播来使其失败。我无法通过更改handle_in接收fail:please方式使其失败chat_channel。如果我在这种情况下发送更改 ref = push socket1, "new:group:recommendation", payload 以使其ref = push socket, "new:group:recommendation", payload不令人惊讶,那就是它会抱怨的事情。

这就是电线上的东西。

我使用通道身份验证,因为我使用的 elm 包还不支持套接字级别的身份验证。所以这就是它的样子chat

结尾