我正在使用一种方法连接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。
答案 0 :(得分:0)
您需要将连接存储在服务器上的某个位置。我建议如下:
在第一个AJAX请求中:
:crypto.strong_rand_bytes(16) |> Base.encode16()
)在第二个AJAX请求中: