我使用标准(规范?)Phoenix chat example来构建一些东西。但是因为我只会处理后端,所以我不想在客户端遇到与JavaScript搏斗的麻烦。我想测试我的房间创建和广播超过3-4个终端会话,这将作为用户。
所以这就是我直接尝试的内容:
iex(2)> Rtc.RoomChannel.join("rooms:gossip", "hey!", {})
{:ok, {}}
嗯,这很奇怪。我本来应该回来一个插座。等一下!傻傻的我,我只是通过一个空元组而不是一个插座,然后把它拿回来。这意味着我只需要传递一个有效的套接字作为第三个参数。凉! 。 。 。
但如何获得套接字?然后我记得我们在channels目录中有一个叫做user_socket的东西,所以我尝试过这样的东西:
iex(5)> h MyApp.UserSocket.connect
@callback connect(params :: map(), Phoenix.Socket.t()) :: {:ok, Phoenix.Socket.t()} | :error
啊哈!现在我知道如何创建套接字。所以,让我们创建一个:
iex(6)> MyApp.UserSocket.connect(%{}, Phoenix.Socket.t())
** (UndefinedFunctionError) undefined function Phoenix.Socket.t/0
(phoenix) Phoenix.Socket.t()
事实上,t()
模块中没有Phoenix.Socket
功能。
我哪里出错了?甚至可以创建这样的套接字,还是我注定要拥有一个JavaScript客户端?
答案 0 :(得分:1)
您应该查看Phoenix.Socket
模块。这是connect/2
回调的定义方式:
...
alias Phoenix.Socket
@callback connect(params :: map, Socket.t) :: {:ok, Socket.t} | :error
...
@type t :: %Socket{id: nil,
assigns: %{},
channel: atom,
channel_pid: pid,
endpoint: atom,
handler: atom,
joined: boolean,
pubsub_server: atom,
ref: term,
topic: String.t,
transport: atom,
transport_name: atom,
serializer: atom,
transport_pid: pid}
远程类型
任何模块也可以定义自己的类型和模块 Elixir也不例外。例如,Range模块定义了t 表示范围的类型:此类型可以称为Range.t。 以类似的方式,字符串是String.t,任何可枚举都可以 Enum.t等等。