0

我使用lein new compojure mongotestlein 2.0 和 Procfile创建了一个组合应用程序web: lein ring server-headless $PORT。这工作正常,但现在当我添加

(def mongolab-url (System/getenv "MONGOLAB_URI"))
(println "mongolab-url")
(println mongolab-url)
(mg/connect-via-uri! mongolab-url)

当我尝试git push heroku masterHeroku 最终给了我

   Compiling mongotest.handler
   mongolab-url
   nil
   Exception in thread "main" java.lang.NullPointerException, compiling:(handler.clj:13:1)
    ... 25 more
   Compilation failed: Subprocess failed
   Error encountered performing task 'compile' with profile(s): 'production'
   Suppressed exit
!  Failed to build.
!  Push rejected, failed to compile Clojure (Leiningen 2) app

我在顶层添加了这些行handler.clj。我看到的一些旧文档是在 中创建的main,但这一定是针对旧版本的 compojure,因为main在生成的应用程序中不再存在(我发现)。在当前版本中应该在哪里建立连接?(或者我的 Procfile 不对?)

(是的,MONGOLAB_URI在 中定义heroku config

4

2 回答 2

1

对我有用并且似乎最惯用的答案是将上述连接放入init同一个文件中的函数(myproject/handler.clj

(defn init[] (mg/connect-via-uri! (System/getenv "MONGOLAB_URI")))

并从更新project.clj文件环描述符行

:ring {:handler myproject.handler/app}

:ring {:handler myproject.handler/app :init myproject.handler/init}
于 2013-09-16T19:12:59.740 回答
0

您不希望在命名空间加载时(实际上是编译时)发生副作用(例如打开数据库连接)。通常,当您在 clojure 启动时编译代码时,您可以摆脱这些事情,但在这种情况下,heroku 会将您的应用程序预编译到一个 jar 中,以便它可以更快地提供它。现在,在编译时,您尝试读取PORT环境变量;但直到 heroku 尝试实际运行您的应用程序时才设置它。

解决方案是仅在运行时创建它,例如通过在-main或其他函数中创建它,或者将其定义为delayforce在运行时创建的。

于 2013-09-14T01:29:18.553 回答