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)
这是浏览器中加载的页面:

我们可以看到,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?谢谢你的帮助.
我按照你的步骤使用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页面,实际的问题是id在user-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,因为它比将字符串解析为数字更容易,更安全.
| 归档时间: |
|
| 查看次数: |
683 次 |
| 最近记录: |