【发布时间】:2016-02-10 04:43:02
【问题描述】:
我正在关注 this 部署到 Heroku 的指南和 this 发送电子邮件的指南。
在开发中一切正常。我的变量在 Heroku 中设置:
heroku config
...
MAILGUN_DOMAIN: https://api.mailgun.net/v3/xxxxxx.mailgun.org
MAILGUN_KEY: key-3-xxxxxx
...
并像这样从配置文件中加载:
config :take_two, Mailer,
domain: System.get_env("MAILGUN_DOMAIN"),
key: System.get_env("MAILGUN_KEY")
但是,当我从环境变量设置 Mailgun 配置时尝试在 Heroku 上发送电子邮件时,我收到此错误:
** (FunctionClauseError) no function clause matching in IO.chardata_to_string/1
(elixir) lib/io.ex:346: IO.chardata_to_string(nil)
(elixir) lib/path.ex:467: Path.join/2
(elixir) lib/path.ex:449: Path.join/1
lib/client.ex:44: Mailgun.Client.send_without_attachments/2
当没有为 Mailgun 客户端设置域时会发生这种情况。但它应该是从环境变量中设置的。我做了一个简单的模块来测试:
defmodule TakeTwo.Mailer do
require Logger
use Mailgun.Client,
Application.get_env(:take_two, Mailer)
def blank_shot do
Logger.info Application.get_env(:take_two, Mailer)[:domain]
Logger.info Application.get_env(:take_two, Mailer)[:key]
send_email from: "steve@xxx.com", to: "speggy@xxx.com", subject: "Hello", text: "This is a blank shot"
end
当我运行TakeTwo.Mailer.blank_shot 时,我看到记录了正确的域/键变量,然后出现错误。我不知道如何远程调试 Mailgun 客户端。
最后,如果我在 shell 中重新创建上述模块(在运行 heroku run iex -S mix 之后)它工作得很好!?
我感觉在加载原始模块时可能还没有加载环境变量??
【问题讨论】:
-
当我查看 Chris Mcoords mailgun 客户端示例时,我注意到的一个区别是
use通过了模块,然后是包含域和密钥的关键字列表。您的示例仅将模块和返回元组的Application.get_env((:take_two, Mailer))传递给它。 github.com/chrismccord/mailgun -
感谢@TheBrofessor,我尝试了两种方式,它似乎在本地工作。我很确定 Application.get_env 返回了一个关键字列表。我注意到 Chris 的示例正在使用模块属性,所以我尝试了相同的结果。
TakeTwo.Mailer.conf显示两个值都是nil。我在那个 repo 上发现了一个相关的问题——我觉得 Heroku 构建包在编译之前没有加载环境变量。所以我想这是下一个要看的部分。 -
哦,快拍。 github.com/HashNuke/… 有答案。事实证明,您需要明确定义要在编译时导出哪些 Heroku 配置变量。愚蠢的我以为它们都会自动导出。
-
不错的发现,我会假设相同的^^
标签: heroku elixir phoenix-framework