我在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))不幸的是,当我连接我的浏览器时,我仍然收到相同的"MongoDB配置是必需的“消息。我还尝试使用CURL和在我的应用程序中定义的各种HTTP路由来访问数据库,但没有成功。但奇怪的是,这在REPL中是可行的。
编辑:更清楚,下面是REPL中的示例:
clj-project-name.db.core> (get-replies 2)
["mew-mew" [1.0 "hello"]]在代码中,我有以下部分:
(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> 以下是在浏览器中加载的页面:

正如我们所看到的,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).我还能做些什么来连接到MongoDB呢?谢谢你的帮助。
发布于 2014-12-03 18:38:49
我按照您的步骤使用Luminus模板创建了新的luminus项目。
我还研究了生成的代码找到了,默认主页是100%静态的。因此,无论实际配置与否,它都显示MongoDB Configuration is Required:
(defn home-page []
(layout/render
"home.html" {:content (util/md->html "/md/docs.md")}))换句话说,它只是将resources/public/md/docs.md呈现到.html中并显示出来,总是显示相同的html页面。
至于你的配置,这是绝对好的。
至于您的user.html页面,实际问题是user-page路由中的id是字符串,而数据库中的_id是数字。所以,不是(get-replies 2),而是打电话给(get-replies "2")。尝试使用字符串化的_id,或者首先用 function或Long/parseLong解析传入的id:
(defn user-page [& [id]]
(layout/render "user.html"
{:id id
:replies (-> id
Long/parseLong ; throws NumberFormatException
project-db/get-replies)}))我建议使用字符串化的_id,因为它比将字符串解析为数字更容易,也更安全。
发布于 2014-11-30 08:35:12
也许是因为您使用defonce而不是def,所以还没有重新加载这些vars (名称空间app-name.db.core中的coll和db )。尝试停止lein进程,然后重新开始:
lein do clean, ring server当您完成此操作后,请考虑进一步处理component工作流:
发布于 2014-12-03 12:50:46
您的应用程序中有太多的移动部件,您为我们提供了对这些移动部件的访问权限,使我们能够清楚地确定是什么给您带来了麻烦。我们所能做的就是给出一般的调试建议。
get-replies是否与user-page位于同一个名称空间中?确保您在repl中没有引用get-replies的旧定义。db命名空间中定义事物的顺序是什么?也许coll、db或get-replies的顺序是错误的,并且悄悄地失败了。(get-replies)在爬虫中工作。user-page在REPL中说了什么?replies值的当前定义转换为整数值时会发生什么?例如,在user-page内部,返回一个{:id id, :replies 5}映射,而不是对get-replies的调用。这一问题的答案将有助于缩小问题的来源。user-page从等式中拿出来,然后从你的get-routes中返回一个字符串吗?一旦有了它,如果您返回get-replies (同样,没有user-page),会发生什么?与所有调试一样,这里的原则是将问题减少到再现问题的最少数量。现在你有很多可能是问题的部分,你只是向我们展示了它们的一瞥。您可以通过删除元素来帮助自己,直到您有了尽可能短的导致问题的调用序列。在寻求帮助或报告错误时,向人们展示这个最小的例子,这样他们就不必学习整个代码库了。更重要的是,代码的复制版本(您为帮助调试而生成的代码)甚至可能没有错误!
您还可以向另一个方向进行调试,方法是从一个新的工作存储库开始,然后一个接一个地从已损坏的repo中添加元素,直到bug出现为止。这在学习新框架(如Luminus )的不确定因素时是有帮助的。
https://stackoverflow.com/questions/27210818
复制相似问题