Я получаю (ArgumentError) ошибку аргумента при попытке использовать elixir / erlang ets - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь использовать библиотеку для создания клиента websocket

websockex вместе с ets

, так как я также используюwebsocket в Фениксе, потому что я делаю приложение типа

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

. Я намерен сохранить объект сокета каждого клиента вместе с идентификатором пользователя, чтобы при получении ответа от стороннего производителяЯ знаю, к какому клиенту, подключенному к моему приложению 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, знаете, в чем может быть проблема или дать мне какое-то временное решение? ... большое спасибо...

...