生产 Elixir 未找到现有原子

Production Elixir Not Finding Existing Atoms

我正在使用一个库,该库使用已经存在的键 (Poison) 将输入解析为地图。无论出于何种原因,在生产中,它认为密钥不存在,我不明白为什么。我确实有一些信息,我希望不是菜鸟的人愿意帮助我弄清楚发生了什么:

1:

如果我进行 IEX 会话(iex -S 混合),我可以 运行 :erlang.binary_to_existing_atom("first_name", :"utf8") 没有问题。但是在生产中,我得到

** (ArgumentError) argument error
  :erlang.binary_to_existing_atom("first_name", :utf8)

2:

我可以在 :erlang.binary_to_existing_atom 之前 运行 :first_name 立即生产,它工作正常,因为到那时,原子已经创建。 BUT,我不能 运行 :first_name 后跟库的方法:Poison.Parser.parse!(~s(#{body}), keys: :atoms!) 因为它会抛出错误,我觉得这很奇怪。

3:

我正在使用 Heroku,不确定这是否重要。原子是在 Ecto 模型中定义的,也不确定这是否重要。任何帮助将不胜感激 - 提前致谢!

您会注意到 Erlang 文档说:

binary_to_existing_atom(Binary, Encoding) -> atom()

Types:

Binary = binary() Encoding = latin1 | unicode | utf8 Works like binary_to_atom/2, but the atom must already exist.

Failure: badarg if the atom does not already exist.

如果我是你,我会尝试找出为什么 :first_name 原子在调用 运行 之前不存在的原因。

Erlang 编译器优化掉已知的纯函数调用并用调用结果替换它们。这从模块中省略了原始原子,从而使其不存在。错误在这里 https://bugs.erlang.org/browse/ERL-453,我可能会修复它。