= Solicitarea Hackney (prin HTTPost) nu returnează rezultatul la rulare. = Bună, am un chat bot simplu scris în elixir. Unul dintre cazurile mele de utilizare este să trimit o interogare la o anumită adresă URL. Mă așteptam ca serverul de interogări să răspundă puțin lent (câteva secunde). Mi-am scris codul și în conexiunea la mașină, codul de interogare rulează normal. Dar când mi-am implementat aplicația la un VPS, interogarea pur și simplu nu returnează un răspuns, nici o eroare sau niciun mesaj. Acest lucru mă înnebunește, deoarece nu am nicio modalitate de a-l depana, deoarece apelul în sine pare să fie blocat și nu se întoarce la infinit. Rularea manuală a curlului în container funcționează, rularea cererii în interiorul iex care de la distanță funcționează nodul de rulare, dar în sistemul live nu funcționează. Poate cineva ma poate ajuta? Mai jos este fragmentul de cod în cauză: http_config = [ hackney: [pool: :tl], recv_timeout: 30_000, timeout: 30_000 ] cu {:ok, body}<- Jason.encodesrc"=>interogare {: ok, %HTTPoison.Response{body: body}}<- HTTPoison.post(url, body,http_config), {:ok, result"=>rezultat, "src_lang"=>src_lang}}<- Jason.decode(body) do result end |>IO.inspect(label: :result) Editare: am adăugat linia de inspectare reprezentativă. Uneori, acest fragment rulează normal, alteori nu. Când am găzduit acest program în VPS-ul dedicat de Black Friday al prietenului meu, nu a avut niciodată această problemă. Dar când m-am mutat în Vultr am această problemă. Am încercat și un alt furnizor VPS pe care l-am folosit în trecut (ramnode) și am aceeași problemă Primul lucru care îmi iese în evidență este că declarația ta cu nu are o clauză else, așa că nu vei înțelege unde eșuează Încercați să adăugați o potrivire else și model pe {:error, reason} tuplu și scrieți-l în log cu sth, cum ar fi `Logger.error("Postare http eșuată: #{eroare de inspectare Atunci ar trebui să puteți vedea de ce eșuează p.s. probabil funcționează pe un shell de la distanță pe sistemul dvs. local, deoarece apelul de rețea este efectuat pe mașina locală (care rulează nodul de la distanță) mai degrabă decât pe serverul de implementare. Pentru a vă asigura că apelul de rețea are loc pe serverul de la distanță, generați un proces pe nodul la distanță (Node.spawn, de exemplu) care face apelul http Ah, îmi pare rău că fragmentul nu spune toată povestea, dar după aceea, indiferent ce se întâmplă, am o linie de înregistrare care spune că comanda s-a terminat de rulat și, în final, dacă rezultatul este {:error, _ } Îl înregistrez. Dar, în cazul meu, linia care spune că funcția s-a terminat de rulat nu primește niciodată apel, la fel ca cererea de post care a rămas blocată, mâna de așteptare nu a revenit niciodată Folosesc versiuni și rulez telecomanda binară de lansare pe serverul de implementare pentru a se conecta la nodul curent care rulează.