我在尝试使用elixir / erlang ets时遇到(ArgumentError)参数错误

时间:2019-03-05 03:43:31

标签: erlang elixir ets

我正在尝试使用该库来创建websocket客户端

websockex以及 ets

因为我也在phoenix中使用websocket,因为我正在创建该类型的应用程序

client --websocket-->phoenix-->websocket-->third-party server

我的意图是将每个客户端的套接字对象与一个uid一起保存,以便当我从第三方服务器获得响应时,我知道哪个客户端连接到我的phoenix应用程序时,我必须将该消息发送至以保存这些套接字我用ets ...

问题在于,每次我尝试写到表时

** (ArgumentError) argument error
    (stdlib) :ets.insert(:sockets, {"uid", "mierda"})
    (stdlib) erl_eval.erl:680: :erl_eval.do_apply/6
    (iex) lib/iex/evaluator.ex:257: IEx.Evaluator.handle_eval/5
    (iex) lib/iex/evaluator.ex:237: IEx.Evaluator.do_eval/3
    (iex) lib/iex/evaluator.ex:215: IEx.Evaluator.eval/3
    (iex) lib/iex/evaluator.ex:103: IEx.Evaluator.loop/1
    (iex) lib/iex/evaluator.ex:27: IEx.Evaluator.init/4
    (websocketsample) lib/websocketsample_web/channels/websocket_communicator.ex:29: WebsocketCommunicator.translate/3
    (websocketsample) lib/websocketsample_web/channels/timer_channel.ex:15: WebsocketsampleWeb.TimerChannel.handle_in/3
    (phoenix) lib/phoenix/channel/server.ex:268: anonymous fn/4 in Phoenix.Channel.Server.handle_info/2 
    (websocketsample) lib/websocketsample_web/endpoint.ex:1: WebsocketsampleWeb.Endpoint.instrument/4
    (stdlib) gen_server.erl:637: :gen_server.try_dispatch/4
    (stdlib) gen_server.erl:711: :gen_server.handle_msg/6

在start_link内进行测试,我尝试保存一个值并立即接收它...这没有问题,但是在我的转换函数中,如果我尝试写入该表,则会遇到上述错误。 ..

我什至尝试使用IEx.pry并在这种情况下保存任何内容(以验证问题是否有效,而我的功能不是问题)我无法有效保存值

defmodule WebsocketCommunicator do
  use WebSockex
  require Logger
  require IEx

  def start_link(opt \\ []) do
    Logger.info("inicializando la tabla")
    :ets.new(:sockets,[:named_table,:public])
    :ets.insert(:sockets, {"test","this works"})
    [{_k,v}] = :ets.lookup(:sockets,"test")  #this works ok
    Logger.info("valor es #{v}" )


WebSockex.start_link("ws://localhost:8999",__MODULE__,:fake_state,opt)
  end


  def translate(client,message,socket) do
    uid = Ecto.UUID.generate()
    IEx.pry()
    :ets.insert(:sockets,{uid,socket}) #this fails
    #inside pry if I type this also fails
    :ets.insert(:sockets,{"something","boom"})
    [{_k,v}] = :ets.lookup(:sockets,uid)
    Logger.info("valor es #{v}" )
    #mensaje = Poison.encode!(%{"uid" => uid, "text"=>message})

    WebSockex.send_frame(client, {:text, "doesnt works!!!"})
  end

  def handle_frame({:text,msg},:fake_state) do
    Logger.info("receiving --> #{msg}")
    {:ok, :fake_state}
    # {:reply,{:text,msg},:fake_state}
  end
end

websockex没有使用genserver,所以我不能使用init函数,您知道这可能是这里的问题还是给我一些解决方法?...非常感谢...

0 个答案:

没有答案