在Clojure Luminus Web框架中配置MongoDB

Cod*_*lus 3 clojure mongodb luminus

我在Luminus项目中配置MongoDB数据库时遇到问题.鉴于lein模板,这应该非常简单:https://github.com/yogthos/luminus-template.键入lein new luminus <name> +mongodb将为您提供默认的mongoDB设置,即文件:src/app-name/db/core.clj要运行服务器,请键入lein ring server应打开Web浏览器并将其指向localhost:3000默认情况.

将显示一个默认主页,对我来说,它告诉我"MongoDB配置是必需的".它告诉我,我可以在同一个文件中配置它:src/app-name/db/core.clj.我尝试了很多不同的东西,但我目前正在尝试的以及对我来说最有意义的是以下内容:

(defonce coll "collection-name")
(defonce db (let [uri "mongodb://127.0.0.1/db-name"
                  {:keys [conn db]} (mg/connect-via-uri uri)]
              db))
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我连接浏览器时,我仍然得到相同的"MongoDB配置是必需的"消息.我也尝试过使用CURL和我的应用程序中定义的各种HTTP路由来访问数据库但没有成功.但奇怪的是,这在REPL中起作用.

编辑:更清楚,以下是REPL中的示例:

clj-project-name.db.core> (get-replies 2)
["mew-mew" [1.0 "hello"]]
Run Code Online (Sandbox Code Playgroud)

在代码中我有以下几件:

 (ns clj-project-name.routes.home
  (:require [compojure.core :refer :all]
            [clj-project-name.layout :as layout]
            [clj-project-name.util :as util]
            [clj-project-name.db.core :as project-db]))

(defn get-replies [id] (mc/distinct db coll "replies" {:_id id}))
(GET "/user" [id] (user-page id))  ; defined in home-routes inside namespace clj-project-name.routes.home 
(defn user-page [& [id]]           ;defined inside namespace clj-project-name.routes.home
  (layout/render "user.html"
                 {:id id
                  :replies (projectl-db/get-replies id)}))

<h1>User {{id}}'s page</h1>           ; part of the HTML template
<p> <b>Replies:</b> {{replies}} </p>  
Run Code Online (Sandbox Code Playgroud)

这是浏览器中加载的页面:

页面显示对mongodb的调用不起作用

我们可以看到,replies列表是空的,它应该 ["mew-mew" [1.0 "hello"]]像我们在REPL中看到的那样.

编辑:另一个奇怪的是,只是在键入后加载浏览器lein ring server我可以mongodb在终端中看到以下输出:

2014-12-02T21:16:57.941-0500 [initandlisten] connection accepted from 127.0.0.1:38854 #28 (5 connections now open).
Run Code Online (Sandbox Code Playgroud)

我还可以做些什么来连接到MongoDB?谢谢你的帮助.

Leo*_*tny 5

我按照你的步骤使用luminus模板创建了新的Luminus项目.

我还研究了生成的代码,默认主页是100%静态的.因此,它显示MongoDB Configuration is Required无论是否实际配置:

(defn home-page []
  (layout/render
    "home.html" {:content (util/md->html "/md/docs.md")}))
Run Code Online (Sandbox Code Playgroud)

换句话说,它只是呈现resources/public/md/docs.md.html并显示它,总是相同的HTML页面.

至于你的配置,它绝对没问题.

至于你的user.html页面,实际的问题是iduser-page路由中是一个字符串,而_id在你的数据库中是一个数字.所以,而不是(get-replies 2)你在呼唤(get-replies "2").尝试使用字符串化的_ids,或者id使用read-string函数Long/parseLong第一个解析传入的s :

(defn user-page [& [id]]
  (layout/render "user.html"
                 {:id id
                  :replies (-> id
                               Long/parseLong ; throws NumberFormatException
                               project-db/get-replies)}))
Run Code Online (Sandbox Code Playgroud)

我建议使用字符串化的_ids,因为它比将字符串解析为数字更容易,更安全.