【问题标题】:Configuring MongoDB in a Clojure Luminus web framework在 Clojure Luminus Web 框架中配置 MongoDB
【发布时间】:2014-11-30 06:51:15
【问题描述】:

我在 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 列表是空的,而我们在 REPL 中看到的应该是 ["mew-mew" [1.0 "hello"]]

编辑: 另一个奇怪的是,当浏览器在输入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?感谢您的帮助。

【问题讨论】:

    标签: mongodb clojure luminus


    【解决方案1】:

    我按照您的步骤使用 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)。尝试使用字符串化的_ids,或首先使用read-string functionLong/parseLong 解析传入的ids:

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

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

    【讨论】:

      【解决方案2】:

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

      lein do clean, ring server
      

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

      https://github.com/stuartsierra/component

      【讨论】:

      • 不幸的是,这也不起作用......我仍然没有连接到 mongodb
      【解决方案3】:

      您的应用程序中的移动部件太多,而您向我们提供的移动部件太少,因此我们无法明确确定是什么给您带来了麻烦。我们所能做的就是提供一般的调试建议。

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-16
        • 2020-07-20
        • 2016-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多