Heroku-Clojure应用程序使用Stuart Sierra组件时出现错误;“主要”;
我正试图在heroku dyno上启动clojure应用程序,但我的stuartsierra.component/start中不断出现错误Heroku-Clojure应用程序使用Stuart Sierra组件时出现错误;“主要”;,heroku,clojure,Heroku,Clojure,我正试图在heroku dyno上启动clojure应用程序,但我的stuartsierra.component/start中不断出现错误 (defrecord Listener [listener] component/Lifecycle (start [component] (assoc component :listener (yada/listener ["/"
(defrecord Listener [listener]
component/Lifecycle
(start [component]
(assoc component :listener (yada/listener
["/"
[(view/view-route)
routes/route-handler
["public/" (new-directory-resource (io/file "target/cljsbuild/public") {})]
[true (as-resource nil)]]]
(or (env :port) (get (read-config "resources/config.edn" {:profile :dev}) :webserver))
)))
(stop [component]
(when-let [close (-> component :listener :close)]
(close))
(assoc component :listener nil)))
(defn new-system []
(component/system-map
:listener (map->Listener {})
))
(def system nil)
(defn init []
(alter-var-root #'system
(constantly (new-system))))
(defn start []
(alter-var-root #'system component/start))
(defn stop []
(alter-var-root #'system
(fn [s] (when s (component/stop s)))))
(defn go []
(init)
(start))
(defn reset []
(stop)
(refresh :after 'web.core/go))
(defn -main
[& [port]]
(component/start (new-system))
(println "System Started")
@(promise))
这是我的核心文件和所有stuartsierra.component代码。当我在笔记本电脑上本地运行它时,执行lein repl
,然后执行(go)
,以及执行lein run
时,这一切都非常有效。所以当我把这个推给heroku dyno时,我很困惑为什么它不起作用
我得到的错误是
Exception in thread "main" clojure.lang.ExceptionInfo: Error in component :listener in system com.stuartsierra.component.SystemMap calling #'com.stuartsierra.component/start {:reason :com.stuartsierra.component/component-function-threw-exception, :function #'com.stuartsierra.component/start, :system-key :listener, :component #web.core.Listener{:listener nil}, :system #<SystemMap>}, compiling:(/tmp/form-init9049917434081554913.clj:1:73)
线程“main”clojure.lang.ExceptionInfo中的异常:组件中的错误:系统com.stuartsierra.component.SystemMap中的侦听器调用#'com.stuartsierra.component/start{:原因:com.stuartsierra.component/component-function-throw-exception,:function#'com.stuartsierra.component/start,:系统键:listener,:component#web.core.listener{:listener nil},:system#},编译:(/tmp/form init9049917434081554913.clj:1:73)
这告诉我,我的:listener
在系统映射中是nil
。当我在(keys system)中本地检查时(执行lein repl
(go)
),则是(:listener)
,这很好,这意味着侦听器正在启动并在系统中
当我执行(>system:listener)
时,我得到#web.core.listener{:listener{:port 3300,:close#object[yada.aleph$listener$fn_u21671 0xa5d4865“yada.aleph$listener$fn__21671@a5d4865“],:server#object[aleph.netty$start_server$reify_uuu13574 0x3cc9a232”aleph.netty$start_server$reify__13574@3cc9a232"]}}
端口已加载(3300)且服务器已启动,这非常完美
这让我更加困惑,为什么我的heroku应用程序中的:listener
是nil
任何帮助都将不胜感激。谢谢你的Procfile
看起来像什么?你能在本地运行heroku本地web
?@codefinger我的Procfile
是web:lein with profile production trampoline run-m web.core
。如果我运行heroku本地web
,我会得到[警告]找不到ENV文件
@codefinger我一直在尝试添加一个ENV文件,但我认为所有的ENV属性都在配置中?这很奇怪。如果您向侦听器添加另一个显式端口,即(或(ENV:port)(get(read-config“resources/config.edn”{:profile:dev}):webserver{:port 3300})
,会发生什么。