2017-03-07 3 views
1

私のアプリを起動するのに少し問題があります。Clojure - StuartSierraComponent Start

は、ここに私のcore.clj

(ns myapp.core 
    (:require [yada.yada :as yada :refer [resource as-resource]] 
      [yada.resources.file-resource :refer [new-directory-resource]] 
      [aero.core :refer [read-config]] 
      [web.view :as view] 
      [web.routes :as routes] 
      [clojure.java.io :as io] 
      [aero.core :refer [read-config]] 
      [com.stuartsierra.component :as component] 
      [clojure.java.jdbc :as jdbc] 
      [clojure.tools.namespace.repl :refer (refresh)] 
      [ring.adapter.jetty :as jetty] 
      [environ.core :refer [env]])) 

(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)]]]   ))) 
    (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]] 
    (let [port (Integer. (or port (env :port) 3300))] 
    (jetty/run-jetty (component/start (new-system)) {:port port :join? false}))) 

私はスチュアートSierraのライブラリ、コンポーネントをテストしています。私はlein repl(go)をすれば

は私がアプリを起動することができますが、私は(私は生産にそれを展開した場合、アプリケーションがどのようなものであるか確認するために)lein runを実行して、私のアプリを起動しようとしています。私は、ブラウザでlein runを行うと、私はエラー

HTTP ERROR: 500 

Problem accessing /view. Reason: 

    com.stuartsierra.component.SystemMap cannot be cast to clojure.lang.IFn 

を取得(new-systemで)システム・マップは誤りである理由を私は知らないので、私は混乱しています。私はまた、エラーが何を意味するかわからないので、私はそれを修正する方法がわからない

誰かが助けてくれますか?ありがとう

+0

この問題は、新しいrepl(emacsからのジャンクイン)を開始し、myapp.core名前空間に変更し、 '(-main" 8080 ")'を評価することで再現できますか? –

答えて

1

-mainファンクションコールjetty/run-jetty関数の最初の引数はリングハンドラでなければなりません - 要求マップを受け取り、応答マップを生成する関数です。あなたは例外につながる代わりにシステムを渡しています。例外は、システムが実際にはレコードであり、ファンクションインタフェースIFnを実装していないため、jettyアダプタが渡されたシステムを関数として呼び出そうとしますが、できないことを意味します。

私はyadaに詳しくはありませんが、yada/listenerは(Aleph)サーバを起動しているようですので、jettyアダプタを明示的に呼び出す必要はありません。

(defn -main [& [port]] (component/start (new-system)))

ポート(またはその他の設定)new-systemの引数として渡され、それを必要とするコンポーネントに転送することができた(あなたのケースでポートがに渡されるべき:あなたのmainは次のようになります。 Listener、次にyada/listenerstartの実装を呼び出す)。