2016-04-19 5 views
1

Ich versuche, eine sehr große JSON-Datei zu laden und es auf eine Variable zu binden, hier ist mein Code, die fehlschlägt .....Elixier mehrere Argumente mit dem Rohr Operator

deps = File.open("../DepMap.json") 
    |> IO.read(:all) 
    |> JSX.decode 

Ich bin zurück

** (FunctionClauseError) no function clause matching in :io.request/2 
(stdlib) io.erl:556: :io.request({:error, :enoent}, {:get_line, :unicode, ""}) 
(elixir) lib/io.ex:82: IO.do_read_all/2 
lib/depchecker.ex:6: (module) 
(stdlib) erl_eval.erl:670: :erl_eval.do_apply/6 

Was fehlt mir hier? Ich gehe davon aus, dass das Ergebnis von File.open als erstes Argument an IO.read (: all) übergeben wird, aber das ist der Punkt des Scheiterns hier und ich bin mir nicht sicher, wie ich das beheben soll.

Antwort

4

File.open gibt entweder {:ok, pid} oder {:error, reason} zurück. Die zweite in Fällen, in denen es fehlschlägt. Hier bekommst du {:error, :enoent}, was bedeutet, dass die Datei nicht existiert - du wirst wahrscheinlich herausfinden müssen, was mit deinem Pfad dort nicht stimmt.

Sie auch die Knall-Version von File.open in Ihrer Pipeline verwenden mögen:

deps = File.open!("../DepMap.json") 
|> IO.read(:all) 
|> JSX.decode 

Dies verhält sich wie File.open, wirft aber eine Ausnahme statt einen Fehlerwert zurückzugeben. Auf Erfolg, obwohl es nur die pid zurückgibt, die die Datei darstellt, die Sie für den Anruf IO.read benötigen.

+0

Danke, ich habe meinen Weg gelöst und dann den Knall benutzt, der meinen anderen Fehler korrigiert hat. –