我有一个图片库应用程序,我从"Web Development with Clojure"一书中制作出来,我正在将其部署到Heroku。我试过让它既可以作为一个独立的超级罐子,也可以用蹦床工作。一开始我尝试使用 environ,但在"db-spec"上不断收到数据库值错误,所以我停止使用它来使其在本地运行良好。我尝试设置自己的环境变量,并使用main.clj文件。我编辑了我的配置文件设置信息,可以部署它,但无法在 heroku 上正常运行。有时我得到一个空白屏幕,可以导航到我的一些页面,然后有时我收到一个 h10 应用程序崩溃错误,正在寻找网站图标,这很难排除故障。
有经验的人可以具体告诉我我需要写什么,以及在什么文件中让它在 Heroku 的生产中工作吗?如果您还可以为我揭开 Heroku 中 Postgres 的环境变量和数据库连接设置的神秘面纱,则加分。
我已经搜索了heroku,environ和leiningen文档。我也在堆栈上搜索了相同的问题,当然,三重工作了我书中的所有示例,这些示例由luminus文档镜像,因为同一个人写了它们。我的应用程序的链接如下。下面是我在github上放置的一个项目版本的链接。
https://github.com/gamma235/picture-gallery
这就是我定义数据库的方式:
(def db
{:subprotocol "postgresql"
:subname "//localhost/gallery"
:user "admin"
:password "admin"})
这是我的主.clj文件:
(ns picture-gallery.main
(:use picture-gallery.handler
[org.httpkit.server :only [run-server]]
[ring.middleware file-info file])
(:gen-class))
(defn -main [& [port]]
(let [port (if port (Integer/parseInt port) 3000)]
(run-server app {:port port})
(println (str "You can view the site at http://localhost:" port)))))
我正在使用[org.clojure/java.jdbc "0.2.3"]
来满足我的数据库需求。这是旧版本,但我正在跟随这本书。
以下是我的project.clj文件的重要部分:
...
:main picture-gallery.main
:min-lein-version "2.0.0"
:plugins [[lein-ring "0.8.7"]]
:ring {:handler picture-gallery.handler/app
:init picture-gallery.handler/init
:destroy picture-gallery.handler/destroy}
:profiles
{:uberjar {:main picture-gallery.main, :aot :all}}
)
我在这里遵循了 heroku shouter 应用程序教程,并毫不费力地部署了它。但是,我无法弄清楚如何根据该项目更改我的图片库应用程序中的代码。像Procfile中的$JVM_OPTS
这样的东西对我来说是神秘的。欢迎任何解释或转介。请浏览 heroku 应用程序的源代码,并在我失败的地方取得成功。
我重构了代码以用 Korma 包装我的数据库:
(ns picture-gallery.models.db
(:require [clojure.java.jdbc :as sql]
[korma.db :refer [defdb transaction]]
[korma.core :refer :all]))
(def db (or (System/getenv "DATABASE_URL")
"postgresql://localhost:5432/gallery"))
(defdb korma-db db)
重新部署它,它工作正常。我仍然不知道为什么它以前不起作用,它只是在我使用 Korma 后才开始工作,仅将 db 定义更改为 DATABASE_URL 并没有做到这一点。我认为它要么与仅支持最新版本的 JDBC(我使用的是 0.2.3)的 Heroku 有关,要么与连接池有关。由于我不知道为什么会发生这种情况,我觉得这个问题仍然悬而未决,但对于其他在我之后遇到同样问题的人,请使用 Korma。最后,我还将模板从打嗝更改为 Selmer,因此这有可能是问题的原因。