2016-01-06 68 views
1

連接,我開始使用Clojure的Luminus公司框架MongoDB的(與商販庫)來開發。 很難理解如何實現mount庫來啓動數據庫連接。Clojure的Luminus公司架構如何調用MongoDB的與安裝

我想出代碼應該放handler.cljinit函數。

但我不知道如何告訴安裝啓動數據庫連接。

請你能幫我一下嗎?

這裏愛頂我的發展config.clj

(ns vippro.config 
    (:require [selmer.parser :as parser] 
      [clojure.tools.logging :as log] 
      [vippro.dev-middleware :refer [wrap-dev]] 
)) 

(def defaults 
    {:init 
    (fn [] 
    (parser/cache-off!) 
    (log/info "\n-=[vippro started successfully using the development profile]=-")) 
    :middleware wrap-dev}) 

handler.cljinit功能

(defn init 
    "init will be called once when 
    app is deployed as a servlet on 
    an app server such as Tomcat 
    put any initialization code here" 
    [] 
    (when-let [config (:log-config env)] 
    (org.apache.log4j.PropertyConfigurator/configure config)) 
    (doseq [component (:started (mount/start))] 
    (log/info component "started")) 
    ((:init defaults))) 

我的主要問題是我應該如何調用該函數從init有道

(defn connect! [] 
    ;; Tries to get the Mongo URI from the environment variable 
    (reset! db (-> (:database-url env) mg/connect-via-uri :db))) 
+0

請再具體些,如果你提供你試圖實現,我們也許能夠告訴你哪裏出了問題。 –

+0

@RicardoAcuna謝謝。我添加了代碼,我認爲是相關的 – shan

回答

1

你原來的問題是關於如何使用mount做到這一點。

雖然你的mongodb客戶端正在初始化,但它看起來並不像你在做什麼,我懷疑它是在名字空間加載時做的。

您定義了一個connect!函數,該函數將值連接並放入原子db中。這不是用mount管理狀態的正確方法,因爲您正在使用自己的原子來存儲狀態。相反,嘗試使用mount.core/defstate創建和銷燬蒙戈客戶端:

(defstate settings 
    :start {:mongo-uri "mongodb://localhost/my-database"}) 

(defn- mongo-connect 
    [{:keys [mongo-uri]}] 
    (mg/connect-via-uri mongo-uri)) 

(defn- mongo-disconnect 
    [{:keys [conn] :as mongo-client}] 
    (mg/disconnect conn)) 

(defstate mongo-client 
    :start (mongo-connect settings) 
    :stop (mongo-disconnect mongo-client)) 

(defn db [] (:db mongo-client)) 

通過這樣做,你的mount好處。

那麼你可以使用environ/env爲您settingsexport MONGO_URI="mongodb://..."

+0

謝謝。那些日子我不知道這件事。 – shan

1

mongodb數據庫s當我設置環境變量

export DATABASE_URL="mongodb://127.0.0.1/dbname" 

自動tarted,然後我就開始環服務器

+0

你應該接受它作爲答案。 –