【问题标题】:Can the client side access socket assigns?客户端访问套接字可以分配吗?
【发布时间】:2019-05-24 08:29:19
【问题描述】:

我知道在 Phoenix Channel 中,服务器可以通过套接字分配保持状态,例如

def join("room:lobby", payload, socket) do
  socket = socket
    |> assign(:message, Enum.random(@messages))
    |> assign(:albums, [])
  {:ok, socket}
end

但是,我无法确定客户是否可以通过任何方式访问这些分配。

我的困惑是,如果一个套接字连接应该在服务器和客户端之间保持直到它被终止,那么客户端不应该也能够访问这个连接中的内容吗?

或者是不是所有这些分配都只保存在服务器端进程中,因此客户端无法访问,即使客户端在某些情况下确实与服务器保持连接怎么办?

如果是这样的话,似乎服务器必须明确地向客户端广播它存储的任何分配,如果它愿意的话?

【问题讨论】:

    标签: javascript websocket elixir phoenix-framework channel


    【解决方案1】:

    我的困惑是,如果应该保持套接字连接 在服务器和客户端之间,直到它被终止,不应该 客户端也可以访问此连接中的内容吗?

    assigns 只是结构中的一个键:

    defmodule Phoenix.Socket
      ...
      ...
      defstruct assigns: %{},
                channel: nil,
                channel_pid: nil,
                endpoint: nil,
                handler: nil,
                id: nil,
                joined: false,
                join_ref: nil,
                private: %{},
                pubsub_server: nil,
                ref: nil,
                serializer: nil,
                topic: nil,
                transport: nil,
                transport_pid: nil
    

    https://github.com/phoenixframework/phoenix/blob/v1.4.0/lib/phoenix/socket.ex#L181

    该结构不在连接中。相反,该结构是服务器用来存储有关特定连接的相关信息的暂存器。根据Channels docs

    为了开始通信,客户端连接到节点(Phoenix 服务器) 使用传输(例如,Websockets 或长轮询)并加入一个或 使用该单一网络连接的更多频道。一台通道服务器 流程是按客户、按主题创建的。 适当的套接字 处理程序为通道服务器初始化一个 %Phoenix.Socket(可能 验证客户端后)。然后通道服务器保留 %Phoenix.Socket{} 并且可以在其内部维护它需要的任何状态 socket.assigns.

    一旦建立连接,来自一个 客户端根据其主题被路由到正确的频道服务器。 如果频道服务器要求广播一条消息,则该消息是 发送到本地 PubSub,后者将其发送到任何连接的客户端 到同一服务器并订阅了该主题。

    --

    似乎服务器必须明确地向客户端广播 分配它已存储,如果它愿意?

    是的。

    您可以在此ElixirCasts.io video 中查看服务器如何使用分配(从 4:15 开始)。

    【讨论】:

    • 谢谢。那一集就是我从哈哈中复制我的例子的地方。但它并没有说明我的问题。
    猜你喜欢
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    相关资源
    最近更新 更多