Clojure Luminus рамки, как называется Mongodb соединиться с креплением

Я начал разрабатывать, используя каркас Clojure luminus с mongodb (с библиотекой monger). Было очень трудно понять, как реализовать mount библиотека для запуска соединения с БД.

Я понял, что код должен поставить handler.clj "s init функция.

Но я не могу понять, как указать 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)))

2 ответа

Решение

Ваш оригинальный вопрос был о том, как использовать 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://..."

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

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

а потом я запустил кольцевой сервер

Другие вопросы по тегам