3

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

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

显示对 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).

我还能做些什么来连接到 MongoDB?谢谢你的帮助。

4

3 回答 3

5

我按照您的步骤使用 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页面,实际问题是路由中是一个字符串,而id在您的数据库中是一个数字。所以,而不是你打电话给. 尝试使用 stringified s,或使用function或first解析传入的 s :user-page_id(get-replies 2)(get-replies "2")_ididread-stringLong/parseLong

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

我建议使用 stringified _ids,因为它比将字符串解析为数字更容易、更安全。

于 2014-12-03T18:38:49.543 回答
1

您的应用程序中有太多活动部件,而您向我们提供的这些活动部件太少,我们无法明确确定是什么导致了您的麻烦。我们所能做的就是提供一般的调试建议。

  1. 确保你有一个干净的环境。关闭您的 REPL、您的 Web 服务器,甚至可能是您的编辑器。按顺序重新启动一切,并记住该顺序。
  2. 我在您的帖子中的代码中看到了一堆奇怪的东西,但我不知道它们是来自您的代码库还是您将代码复制到问题中的产物。l -db项目是什么?是否get-replies在同一个命名空间中user-page?确保您没有引用get-repliesrepl 中的旧定义。
  3. 命名空间中的定义顺序是什么db?也许coll, db, 或者get-replies顺序错误,悄悄地失败了。
  4. 你说(get-replies)在repl中有效。user-pageREPL 中说了什么?
  5. 您说您看到“需要 MongoDB 配置”消息,但我没有看到。是来自环服务器,显示在浏览器中,还是在浏览器控制台中?
  6. 当您将 的值的当前定义切换为replies整数值时会发生什么?例如在里面user-page,返回一个映射{:id id, :replies 5}而不是调用get-replies。这个问题的答案将有助于缩小问题的来源。
  7. user-page能从等式中取出一个字符串get-routes吗?一旦你有了它,如果你返回get-replies(再次,没有user-page)会发生什么?

与所有调试一样,这里的原则是将问题减少到重现问题的最少数量。现在你有很多可能是问题的部分,你只是向我们展示了它们的一瞥。通过删除元素来帮助自己,直到您有可能导致问题的最短调用序列。在寻求帮助或报告错误时,向人们展示最小的示例,这样他们就不必学习你的整个代码库。更重要的是,代码的复制版本(您为人们提供帮助调试的代码)甚至可能没有错误!

您还可以从另一个方向进行调试,从一个新的工作存储库开始,并从损坏的存储库中逐个添加元素,直到出现错误。这在学习像 Luminus 这样的新框架的细节时会很有帮助。

于 2014-12-03T12:50:46.280 回答
1

可能是因为您使用defonce而不是def,那些变量(colldb在命名空间中app-name.db.core)没有被重新加载。尝试停止 lein 进程并重新开始:

lein do clean, ring server

完成此操作后,请考虑对component工作流程采取进一步措施:

https://github.com/stuartsierra/component

于 2014-11-30T08:35:12.017 回答