生产 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,我可能会修复它。
我正在使用一个库,该库使用已经存在的键 (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,我可能会修复它。