Clojure luminus框架如何调用mongodb connect with mount

Clojure luminus framework how to call mongodb connect with mount

我开始使用 Clojure luminus 框架mongodb(使用 monger 库)进行开发。 很难理解如何实现 mount 库来启动数据库连接。

我发现代码应该放入 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.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)))

当我设置环境变量

时mongodb数据库自动启动
export DATABASE_URL="mongodb://127.0.0.1/dbname"

然后我启动了环形服务器

您最初的问题是关于如何使用 mount 来执行此操作。

虽然您的 mongodb 客户端正在初始化,但我怀疑它是在加载名称空间时执行的。

您定义了一个 connect! 函数,它连接并将值放入原子 db 中。这不是使用 mount 管理状态的正确方法,因为您使用自己的原子来存储状态。相反,尝试使用 mount.core/defstate 创建和销毁 mongo 客户端:

(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://..."