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"
а потом я запустил кольцевой сервер