Clojure luminus框架如何调用mongodb connect with mount
Clojure luminus framework how to call mongodb connect with mount
我开始使用 Clojure luminus 框架 和 mongodb(使用 monger 库)进行开发。
很难理解如何实现 mount
库来启动数据库连接。
我发现代码应该放入 handler.clj
的 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
的 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)))
当我设置环境变量
时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
作为你的 settings
和 export MONGO_URI="mongodb://..."
我开始使用 Clojure luminus 框架 和 mongodb(使用 monger 库)进行开发。
很难理解如何实现 mount
库来启动数据库连接。
我发现代码应该放入 handler.clj
的 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
的 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)))
当我设置环境变量
时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
作为你的 settings
和 export MONGO_URI="mongodb://..."