首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Clojure Luminus web框架中配置MongoDB

在Clojure Luminus web框架中配置MongoDB
EN

Stack Overflow用户
提问于 2014-11-30 06:51:15
回答 3查看 777关注 0票数 3

我在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. --我尝试了许多不同的东西,但我目前正在尝试的,以及对我来说最有意义的是:

代码语言:javascript
复制
(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中的示例:

代码语言:javascript
复制
clj-project-name.db.core> (get-replies 2)
["mew-mew" [1.0 "hello"]]

在代码中,我有以下部分:

代码语言:javascript
复制
 (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的以下输出:

代码语言:javascript
复制
2014-12-02T21:16:57.941-0500 [initandlisten] connection accepted from 127.0.0.1:38854 #28 (5 connections now open).

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-03 18:38:49

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

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

代码语言:javascript
复制
(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,或者首先用 functionLong/parseLong解析传入的id

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

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

票数 5
EN

Stack Overflow用户

发布于 2014-11-30 08:35:12

也许是因为您使用defonce而不是def,所以还没有重新加载这些vars (名称空间app-name.db.core中的colldb )。尝试停止lein进程,然后重新开始:

代码语言:javascript
复制
lein do clean, ring server

当您完成此操作后,请考虑进一步处理component工作流:

https://github.com/stuartsierra/component

票数 1
EN

Stack Overflow用户

发布于 2014-12-03 12:50:46

您的应用程序中有太多的移动部件,您为我们提供了对这些移动部件的访问权限,使我们能够清楚地确定是什么给您带来了麻烦。我们所能做的就是给出一般的调试建议。

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

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

您还可以向另一个方向进行调试,方法是从一个新的工作存储库开始,然后一个接一个地从已损坏的repo中添加元素,直到bug出现为止。这在学习新框架(如Luminus )的不确定因素时是有帮助的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27210818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档