访问2个模块elixir

时间:2018-02-05 14:47:50

标签: elixir

我正在使用一种方法连接server作为

  connect_to_server(ip, username, password)
  |> check_status_for_server()

  defp check_status_for_server({:error, :nxdomain}), do: {"IP doesn't seem correct.", :error}
  defp check_status_for_server({:error, :timeout}), do: {"Server is giving timeout.", :error}
  defp check_status_for_server({:error, reason}), do: {reason, :error}
  defp check_status_for_server({:ok, connection}), do: {true, connection}

  defp connect_to_server(ip, username, password), do:
    SSHEx.connect(ip: ip, user: username, password: password)

由于连接成功,我得到connection,当用户点击表单中的按钮时,以上所有内容都有效,而表单包含2个按钮,1表示此连接,第2个表示使用该连接(两者都是ajax请求。)

但是你可以看到两个按钮都发送一个ajax请求,并且两个ajax调用命中2 def s,一个正在建立连接而第二个正在使用该连接进行操作,我不知道如何制作此连接已创建一次,也可在第二个def中使用。

这是第二次ajax调用的结束方法 def create_raid(conn, params) do这是第一个

  def details_about_raid(conn, %{"ip" => ip, "username" => username, "password" => password} = _params) do
    connect_to_server(ip, username, password)
    |> check_status_for_server()
    |> still_in_pipe_operate(conn)
  end

我尝试将连接pid发送回ajax响应,但失败了。任何帮助都会感激不尽。

更新: 我试图用密钥保存ets表中的连接pid并出现此错误。

** (exit) an exception was raised:
    ** (ArgumentError) argument error
        (stdlib) :ets.insert(:connection, {"70122EE1441B746788CD11FC83B3B211", #PID<0.435.0>})

我已经在Repo模块中创建了连接表。

更新:

我错误地初始化了ETS表,

  def start_ets_connection do
    :ets.new(:connection, [:set, :protected, :named_table])
  end

它应该是:public而不是:protected,现在它工作正常,我也可以将conn保存到ETS。

1 个答案:

答案 0 :(得分:0)

您需要将连接存储在服务器上的某个位置。我建议如下:

在第一个AJAX请求中:

  1. 连接到远程服务器(就像您已经在做的那样)。
  2. 创建随机密钥。 (您可以使用例如:crypto.strong_rand_bytes(16) |> Base.encode16()
  3. 将密钥与连接一起存储在ETS表或代理中。
  4. 将随机密钥返回给客户端。
  5. 在第二个AJAX请求中:

    1. 将第一个请求返回的密钥发送到服务器。
    2. 使用密钥从ETS表或代理获取连接。
    3. 使用此连接。