2016-01-06 3 views
1

Я начал развиваться с использованием Clojure рамки LUMINUS с MongoDB (с библиотекой торговца). Было очень сложно понять, как реализовать библиотеку mount, чтобы начать соединение с db.рамки Luminus Clojure как вызвать MongoDB соединения с креплением

Я понял, что код должен положить handler.cljinit функция.

Но я не могу понять, как сообщить mount, чтобы начать соединение с базой данных.

Пожалуйста, не могли бы вы дать мне руку?

Здесь забодает мое развитие 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.clj «s init функция

(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 спасибо. Я добавил код, который, как мне кажется, relavent – 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 как ваш settings и export MONGO_URI="mongodb://..."

+0

Спасибо. В те дни я не знал об этом. – shan

1

База данных mongodb s автоматически, когда к работе я установить переменную окружения

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

, а затем я начал кольцо сервер

+0

Вы должны принять его как ответ. –

Смежные вопросы