2016-08-01 58 views
2

偶爾,當我在我的Elixir代碼中輸入一個錯字併發生一個CompileError時,即使我修好了所有內容並繼續打印,Phoenix也拒絕生活刷新App.Endpoint.path/1 is undefinedApp是我的應用程序) 。當然,終點定義得非常好,只要我重新啓動mix phoenix.server就會再次運行。鳳凰在編譯時出錯

據我所知,我在最新版本的一切。由於我在網上找不到任何關於這個錯誤的信息,我懷疑我的配置有誤,我很感謝你對如何找到這個錯誤的建議。

[info] Sent 200 in 200ms 
iex[debug] Live reload: web/resolver/reviewer.ex 
[debug] Live reload: web/resolver/reviewer.ex 
Compiling 20 files (.ex) 

== Compilation error on file web/resolver/reviewer.ex == 
** (Ecto.Query.CompileError) unbound variable `f` in query 
    (ecto) expanding macro: Ecto.Query.preload/3 
    (app) web/resolver/reviewer.ex:519: App.Resolver.Reviewer.sc_data/1 
    (elixir) expanding macro: Kernel.|>/2 
    (app) web/resolver/reviewer.ex:520: App.Resolver.Reviewer.sc_data/1 
    (elixir) lib/kernel/parallel_compiler.ex:116: anonymous fn/4 in Kernel.ParallelCompiler.spawn_compilers/1 

[error] #PID<0.2279.0> running App.Endpoint terminated 
Server: localhost:4000 (http) 
Request: GET /reviewers/2016/1234 
** (exit) an exception was raised: 
    ** (UndefinedFunctionError) function App.Endpoint.path/1 is undefined (module App.Endpoint is not available) 
     (app) App.Endpoint.path("/phoenix/live_reload/frame") 
     (phoenix_live_reload) lib/phoenix_live_reload/live_reloader.ex:115: Phoenix.LiveReloader.reload_assets_tag/1 
     (phoenix_live_reload) lib/phoenix_live_reload/live_reloader.ex:97: anonymous fn/1 in Phoenix.LiveReloader.before_send_inject_reloader/1 
     (elixir) lib/enum.ex:1623: Enum."-reduce/3-lists^foldl/2-0-"/3 
     (plug) lib/plug/conn.ex:909: Plug.Conn.run_before_send/2 
     (plug) lib/plug/conn.ex:355: Plug.Conn.send_resp/1 
     (phoenix) lib/phoenix/code_reloader.ex:50: Phoenix.CodeReloader.call/2 
     (app) lib/app/endpoint.ex:1: App.Endpoint.phoenix_pipeline/1 
     (app) lib/plug/debugger.ex:93: App.Endpoint."call (overridable 3)"/2 
     (app) lib/app/endpoint.ex:1: App.Endpoint.call/2 
     (plug) lib/plug/adapters/cowboy/handler.ex:15: Plug.Adapters.Cowboy.Handler.upgrade/4 
     (cowboy) src/cowboy_protocol.erl:442: :cowboy_protocol.execute/4 
[error] Ranch protocol #PID<0.2281.0> (:cowboy_protocol) of listener App.Endpoint.HTTP terminated 
** (exit) killed 
Compiling 20 files (.ex) 

== Compilation error on file web/resolver/reviewer.ex == 
** (Ecto.Query.CompileError) unbound variable `f` in query 
    (ecto) expanding macro: Ecto.Query.preload/3 
    (app) web/resolver/reviewer.ex:519: App.Resolver.Reviewer.sc_data/1 
    (elixir) expanding macro: Kernel.|>/2 
    (app) web/resolver/reviewer.ex:520: App.Resolver.Reviewer.sc_data/1 
    (elixir) lib/kernel/parallel_compiler.ex:116: anonymous fn/4 in Kernel.ParallelCompiler.spawn_compilers/1 

^C 
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded 
     (v)ersion (k)ill (D)b-tables (d)istribution 
+1

也許你可以完全確定,你的端點是好的,只需要附加它。 – PatNowak

+0

好的,所以終點似乎實際上已經死了。我偶爾會得到**(退出)異常: **(UndefinedFunctionError)函數App.Endpoint.call/2未定義(模塊App.Endpoint不可用)。一個端點如何死亡,而不是由主管重新啓動? –

+0

您的終端是使用Phoenix.endpoint還是您最近更改了您的應用的名稱,並且在終端中也沒有更改? – PatNowak

回答

0

看來,鳳凰城的現場重裝功能是Endpoint的一部分,所以一旦後者崩潰,重裝代碼不工作了。

有可能通過在代碼中插入錯誤而使端點崩潰,例如,通過添加plug :some_imaginary_plug或在router.ex中引起語法錯誤,因爲路由器也被插入端點。

現在,事實證明,我正在使用Absinthe包-所有/graphql請求直接向Absinthe插頭。因此,任何GraphQL類型定義和相關resolver函數(恰好構成我的大部分應用程序)都很脆弱:由於它們間接(但不可避免地)導致端點崩潰導致任何不顯眼的CompileError

我已經找到了最好的解決方法 - 直到苦艾酒的開發者管理,以使獨立於類型DEFS,他們已經建議他們將解析器 - 是與iex -S mix phoenix.server啓動服務器,並手動運行recompile每當端點崩潰。雖然這並沒有解決CodeReloader作爲Endpoint的一部分而不是反之亦然的問題,但它使我無需每次都重新運行webpack,這是最大的難題。