【发布时间】:2016-01-06 23:28:40
【问题描述】:
我遇到了部署在 heroku 上的 phoenix 应用程序的问题。当我在本地运行此代码时,一切正常,没有错误。部署到 heroku 时,应用程序成功部署并启动,但在使用应用程序 GenServer 时,进程崩溃并出现以下错误:
[error] GenServer :main_worker terminating
** (exit) an exception was raised:
** (ErlangError) erlang error: :"function not exported"
(elixir) Map.get_and_update!(%{"location" => %{"latitude" => 35.9628632, "longitude" => -86.8216522}, "name" => "Dover", "pickups" => 0}, "pickups", #Function<0.62518121/1 in BusTracker.MainWorker.handle_call/3>)
(bus_tracker) lib/bus_tracker/main_worker.ex:27: BusTracker.MainWorker.handle_call/3
(stdlib) gen_server.erl:629: :gen_server.try_handle_call/4
(stdlib) gen_server.erl:661: :gen_server.handle_msg/5
(stdlib) proc_lib.erl:240: :proc_lib.init_p_do_apply/3
13:25:03.112 [error] GenServer #PID<0.319.0> terminating
** (exit) an exception was raised:
** (ErlangError) erlang error: {{:undef, [{Map, :get_and_update!, [%{"location" => %{"latitude" => 35.9628632, "longitude" => -86.8216522}, "name" => "Dover", "pickups" => 0}, "pickups", #Function<0.62518121/1 in BusTracker.MainWorker.handle_call/3>], []}, {BusTracker.MainWorker, :handle_call, 3, [file: 'lib/bus_tracker/main_worker.ex', line: 27]}, {:gen_server, :try_handle_call, 4, [file: 'gen_server.erl', line: 629]}, {:gen_server, :handle_msg, 5, [file: 'gen_server.erl', line: 661]}, {:proc_lib, :init_p_do_apply, 3, [file: 'proc_lib.erl', line: 240]}]}, {GenServer, :call, [:main_worker, {:update_pickups, {"Dover", 1}}, 5000]}}
(elixir) lib/gen_server.ex:356: GenServer.call/3
(bus_tracker) web/channels/main_channel.ex:38: BusTracker.MainChannel.handle_in/3
(phoenix) lib/phoenix/channel/server.ex:210: Phoenix.Channel.Server.handle_info/2
(stdlib) gen_server.erl:615: :gen_server.try_dispatch/4
(stdlib) gen_server.erl:681: :gen_server.handle_msg/5
(stdlib) proc_lib.erl:240: :proc_lib.init_p_do_apply/3
这是错误引用的代码。
defmodule BusTracker.MainWorker do
use GenServer
# . . .
# Server
25> def handle_call({:update_pickups, {name,num}}, _, state) do
26> waypoint = state.waypoints[name]
27> {_, new_waypoint} = Map.get_and_update! waypoint, "pickups", fn(val) -> {"pickups", val + num} end
28> {_, new_waypoints} = Map.get_and_update! state.waypoints, name, fn(val) -> {name, new_waypoint} end
29> {_, new_state} = Map.get_and_update! state, :waypoints , fn(val) -> {:waypoints, new_waypoints} end
30> {:reply, new_waypoint["pickups"], new_state}
31> end
# . . .
end
我正在使用这些 Heroku 构建包:
- github.com/HashNuke/heroku-buildpack-elixir.git
- github.com/gjaldon/heroku-buildpack-phoenix-static.git
这是我的 elixir_buildpack.config:
# Erlang version
erlang_version=18.1.3
# Elixir version
elixir_version=1.0.4
# Always rebuild from scratch on every deploy?
always_rebuild=false
# Export heroku config vars
# config_vars_to_export=(DATABASE_URL)
# A command to run right after compiling the app
post_compile="pwd"
在Aug 5th, 2015 的 elixir irc 频道中提到了这一点,但我无法弄清楚如何解决这个问题,与那个讨论。我是一个长生不老药/二郎新手,所以有人可以给我一些帮助吗?谢谢
【问题讨论】:
-
您在本地运行的 Elixir 和 Erlang 版本是否与您在 buildpack 中定义的版本相同?
-
哇,完全是新手的错误。实际上版本不同,所以我在构建包中更新到 Elixir 1.1.1,问题就消失了。谢谢@Gazler!
-
您应该尽可能将 Gazler 的回答标记为“已接受”。
标签: heroku elixir phoenix-framework