通过iex测试Phoenix频道(用于聊天)

时间:2016-09-08 16:51:11

标签: sockets elixir phoenix-framework

我使用标准(规范?)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客户端?

1 个答案:

答案 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}

Typespecs

  

远程类型

     

任何模块也可以定义自己的类型和模块   Elixir也不例外。例如,Range模块定义了t   表示范围的类型:此类型可以称为Range.t。   以类似的方式,字符串是String.t,任何可枚举都可以   Enum.t等等。