如何解决客户端连接后,如何让Phoenix自动加入频道?
我在Phoenix Channels上使用了websocket传输,但是我试图为没有Phoenix.socket
客户端而只能用于websocket的消费者提供一个干净的API。
目前我有类似的东西
defmodule MyWeb.UserSocket do
require Logger
use Phoenix.socket
alias Exchange.{Account,ApiKey}
channel "room:time",MyWeb.TimeChannel
channel "alpha:*",MyWeb.AlphaChannel
channel "beta:*",MyWeb.BetaChannel
def connect(%{"api-key" => _} = params,socket,connect_info) do
with %{"api-key" => api_key,"api-expires" => api_expires,"api-signature" => api_signature} <-
params,{:ok,%ApiKey{} = key} <- ApiKey.fetch(api_key),%Account{} = account} <-ApiKey.authorize(...)) do
Logger.info("Authorized account #{account.account_id} via API key on websocket")
#JOIN CHANNELS HERE
{:ok,assign(socket,:account,account)}
else
{:error,e} ->
Logger.error("Websocket auth error #{inspect(e)}")
{:ok,socket}
end
end
end
解决方法
这可能太简单了,但是您尝试过
Phoenix.PubSub.subscribe(MyApp.PubSub,"topic")
?
文档-https://hexdocs.pm/phoenix_pubsub/Phoenix.PubSub.html
,这个问题的答案不是在接口上使用Phoenix通道,而是编写一个单独的Transport
实现方式来订阅Phoenix。
我通过定义一个新模块创建了一个新的套接字传输:
@behaviour Phoenix.Socket.Transport
并提供了endpoint.ex
中的袜子:
socket "/realtime",MyWeb.MyCustomSocket,websocket: true
此模式遵循GenServer
类型的布局。我在init
订阅了我想要的Phoenix频道,然后将这些事件重新发送到套接字。
这创建了一个单向网络套接字,不需要任何Socket
知识就可以连接和收听。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。