簡體   English   中英

訪問2個模塊中的變量

[英]Access a variable within 2 modules 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 ,一個正在建立連接,第二個正在使用該連接進行操作,我不知道如何使該連接創建一次並可用第二防御也是如此。

這是第二個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響應,但是失敗了。 任何幫助將是感激的。

更新:我試圖用密鑰將連接pids保存在ets表中,但出現此錯誤。

** (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中。

您需要將連接存儲在服務器上的某個位置。 我建議以下內容:

在第一個AJAX請求中:

  1. 連接到遠程服務器(就像您已經在做的那樣)。
  2. 創建一個隨機密鑰。 (您可以使用例如:crypto.strong_rand_bytes(16) |> Base.encode16()
  3. 將密鑰以及連接存儲在ETS表或代理中。
  4. 將隨機密鑰返回給客戶端。

在第二個AJAX請求中:

  1. 將第一個請求返回的密鑰發送到服務器。
  2. 使用密鑰從ETS表或代理中獲取連接。
  3. 使用此連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM