【问题标题】:Production Elixir Not Finding Existing Atoms生产长生不老药没有找到现有的原子
【发布时间】:2015-12-14 19:26:16
【问题描述】:

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

1:

如果我进行 IEX 会话(iex -S mix),我可以毫无问题地运行 :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,它工作正常,因为那时原子已经创建。 但是,我无法运行 :first_name 后跟库的方法:Poison.Parser.parse!(~s(#{body}), keys: :atoms!),因为它会引发错误,我觉得这很奇怪。

3:

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

【问题讨论】:

    标签: erlang elixir ecto


    【解决方案1】:

    你会注意到 Erlang 文档说:

    binary_to_existing_atom(二进制,编码) -> atom()

    类型:

    二进制 = binary() 编码 = latin1 |统一码 | utf8 像 binary_to_atom/2,但原子必须已经存在。

    失败:如果原子不存在,则为 badarg。

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

    【讨论】:

    • 这就是我要问的。如果我认为我定义了它,为什么原子不在那里?我该怎么做才能解决这个问题?
    • 好吧,鉴于您只提到了您对 Poison.Parser 的调用,很难猜测发生了什么。您提到从 Ecto 模型中获取原子——也许您可以分享有关您的模型的更多细节?
    • 我要检查的一件事——确保“身体”是你认为的那样。对其进行 IO.inspect 或类似操作以确保它包含 :first_name。
    • 顺便说一句,我还要仔细检查该函数调用的语法:“keys: :atoms!”那个感叹号看起来不对。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多