gpt4 book ai didi

mongodb - 在 Clojure Luminus Web 框架中配置 MongoDB

转载 作者:可可西里 更新时间:2023-11-01 09:23:08 26 4
gpt4 key购买 nike

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

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

page showing that the call to mongodb does not work

正如我们所见,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?感谢您的帮助。

最佳答案

我按照您的步骤使用 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,或使用 read-string function 解析传入的 idLong/parseLong 第一:

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

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

关于mongodb - 在 Clojure Luminus Web 框架中配置 MongoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27210818/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com