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

elixir - 当客户端连接时,如何让 Phoenix 自动加入频道?

我正在使用带有 Phoenix Channels 的 websocket 传输,但我正在尝试为没有Phoenix.Socket客户端的消费者提供一个干净的 API,以便仅使用 websockets。

为简单起见,我想在用户打开会话时自动订阅各种频道。

目前我有类似的东西:

我需要在“加入频道”中输入什么内容才能订阅?

0 投票
0 回答
120 浏览

google-app-engine - 具有 Channels websockets 的 Elixir Phoenix 应用程序无法在 Google AppEngin 上运行

我尝试使用 Channels 运行 Elixir 网络应用程序,但它在 AppEngine Flex 上不起作用。我使用了以下说明:https ://cloud.google.com/community/tutorials/elixir-phoenix-on-google-app-引擎

我的应用程序非常简单,只有一个 hello world websockets 应用程序(https://hexdocs.pm/phoenix/channels.html)。它在本地工作。在 App Engine 上部署时,普通的 HTTP 请求可以工作,但套接字功能不会传播到不同的客户端。有什么我做错了吗?或者 AppEngine 方面有什么限制吗?

0 投票
2 回答
588 浏览

websocket - 如何使用 WebSockex 公开我自己的 Elixir websocket

我在这里看到了 Elixir 的 WebSockex 库的基本示例,但它并没有真正解释我如何将自己的 websocket 公开到互联网这个问题的答案解释了如何在外部与现有的 websocket 聊天,但我想公开我自己的 websocket。我实际上是在使用 websockex 作为 Phoenix 应用程序的一部分,所以 Phoenix 的一些可能在这里有所帮助?

我显然知道我的 phoenix 应用程序的 ip:port 组合,所以鉴于这些,我如何在该 ip:port 上公开一个 websockex websocket?换句话说,我应该传递什么作为 URL?在这个基本示例代码中:

请注意,我需要公开原始 websocket,而不是 Phoenix 频道,因为消费者不了解 Phoenix 频道。如果 Phoenix 可以公开原始 websocket,那么我也会认为这是一个解决方案。

如果 Phoenix 和 WebSockex 都无法提供帮助,我有什么选择?

0 投票
1 回答
211 浏览

elixir - 如何处理来自另一个进程的消息,以便它们在 Elixir Phoenix 通道上发送

我有基于docs完美运行的频道,并且我的应用程序正在按预期接收和重新广播消息:

在此处输入图像描述

这是处理通道的代码:

然而,我真正想要的是通过这个 Phoenix 频道发送来自不同 Elixir 进程的消息(恰好通过 websockets 订阅了第三方 API)。因此,每当我从第三方处理程序进程中获得 websocket 消息时,我都想将该消息发送到该RoomChannel模块,并让它将消息沿通道发送到浏览器。

我该怎么做呢?是否有一个handle_info我可以编写的 GenServer 样式的处理程序来侦听其中的传入消息RoomChannel并将其发送到 Phoenix 通道?

还是我必须以某种方式将 Phoenix 套接字发送到另一个 GenServer 以在那里处理它?

0 投票
1 回答
198 浏览

elixir - 如何使用phoenix广播到一个socket_id

在文档中有这个例子,但它只适用于断开连接https://hexdocs.pm/phoenix/Phoenix.Socket.html#module-examples

我试过了,它只适用于断开连接。

我读过一些地方,你可以为该用户创建一个特定的主题,但我可以使用一个实际的例子。我无法理解复杂性,可以使用一个实际的例子。

谢谢你。

我在想如果你能得到 ets 表中的底层套接字,你就可以push/4到那个套接字,但我不知道该怎么做。

0 投票
0 回答
40 浏览

electron - 使用 phoenix-channels 和电子的网络工具中未显示 Websocket

我已经构建了一个客户端 js 应用程序,它使用 Phoenix 通道(使用 Node.js 14.16.0、Chromium 89.0.4389.128 和 Electron 12.0.7)与 elixir 服务器通信。一切正常(接收/发送套接字),但在网络工具中没有显示任何内容(既没有首先获得 101 请求,也没有 WS 流量..)有人有解决这个问题的想法吗?谢谢 ;)

0 投票
0 回答
167 浏览

elixir - 保护伞下的应用程序之间的 Phoenix PubSub

我创建了一个伞形应用程序并在我的凤凰应用程序中mix phx.new --umbrella ... 生成了一个电影 CRUD 。mix phx.gen.html ...那么,如何“告诉”另一个应用程序(在伞内)刚刚创建了电影。

项目结构:

  • myapp_umbrella
    • 应用
      • app_listener
      • 我的应用程序(外)
      • my_app_web(凤凰)
0 投票
1 回答
84 浏览

android - 如何从 Kotlin Android 应用程序连接到 Phoenix 频道?

我正在考虑使用Elixir Phoenix后端和Kotlin Android客户端构建一个全栈项目。

该应用程序将需要类似于聊天的功能的实时数据,因此我将不得不使用凤凰频道。经过快速研究,我发现 Phoenix 在经典的 WebSocket 逻辑之上有某种额外的层,我必须使用它。

而且我不知道如何做到这一点,或者是否有一个库可以用来做这件事。我在 GitHub 上看到了一些库,但我不知道它们的性能如何,所以我不确定是否要使用它们。

如果有人能解释它是如何工作的,如果我需要额外的工具以及经典的 Retrofit(或 Ktor 客户端)来在 Phoenix 后端和 Kotlin Android 客户端之间发送和接收实时数据,那就太好了。

我已经知道如何处理 HTTP 请求之类的事情,主要是使用 Phoenix 后端和 Kotlin Android 应用程序的 CRUD,但我之前从未使用 Phoenix 后端和 Kotlin Android 应用程序实现任何实时功能。

谢谢!

0 投票
1 回答
34 浏览

elixir - 状态如何存储在房间/频道中?

我正在尝试将 Phoenix Channels 用作极其简单的游戏服务器。对于原型,其唯一目的是同步玩家位置。但是,在此之前,每个客户端都必须知道所有其他客户端的存在。

当一个新客户加入房间时,我将其广播给所有在场的客户RoomChannel

这些现有的客户端对消息做出反应并产生一个新的玩家对象。但是,新用户不知道房间里还有谁,因为他们是最后加入的,并且没有收到任何此类信息。我正在努力纠正这一点。

我的计划是将我的代码修改为如下内容:

换句话说,我想维护一个加入用户的列表,并在加入时将其发送给新用户(并将它们添加到其中)。我是否使用代理、GenServer 或其他东西都无关紧要。

问题是,我不知道在哪里可以初始化那个代理,因为我RoomChannel没有init()回调;也不如何将它传递给join()andhandle_info()回调。什么是有效的——或者更好的,惯用的——方法来做到这一点?


PS值得注意的是,我希望将其存储在内存中,而不是数据库中。

0 投票
1 回答
29 浏览

elixir - Elixir Phoenix 1.6 - 尝试将令牌传递给浏览器,函数 nil.id/0 未定义或私有

我正在开发 Phoenix 1.6 应用程序。我通过 GitHub 使用 Ueberauth 进行身份验证,它正在工作。我设置了一个发布主题和评论的频道,经过身份验证的用户可以这样做。接下来,我尝试添加一个用户令牌以在频道中使用。我按照使用mix phx.new.socket User创建的样板代码中的说明进行操作。在user_socket.js文件中,有在模板中创建令牌的说明,它有效。令牌在连接函数的user_socket.ex中进行验证。我在router.ex中创建了一个新插件put_user_token以将令牌添加到conn,这也有效。但是,我对插件中的逻辑有疑问。这是我的代码:

只要我登录就可以使用。问题是当我注销并尝试重新登录时。插件中 if 语句的样板代码是:

我的代码不同,因为当前用户被定义为user,其值等于数据库中用户记录的 id。我认为问题在于,在设置 Ueberauth 时,我创建了另一个插件SetUser,它位于put_user_token插件之前。这是 SetUser 的调用函数:

似乎正在发生的事情是,在我注销后,应用程序重定向到主页,这导致插件执行,并且conn.assigns.user的值设置为nil。然后发生错误,我无法重新登录。

我需要想出一种方法让put_user_token插件中的if语句能够处理nil值。我尝试了 is_integer(conn.assigns.user)和其他一些比较,但如果存在nil值,则应用程序崩溃。