“使用Clojure进行Web开发”:无此类变量:db / get-user

黑风

我正在使用“使用Clojure进行Web开发”这本书来制作教程留言簿应用程序,但遇到了麻烦。自从本书发行以来,似乎某些库及其功能已经更新,这对我的Web开发造成了一些坎bump的介绍。我可以通过在可能的情况下更新依赖关系或在不可以的情况下使用旧版本的库来解决大多数问题,但是这种策略已达到极限,我遇到了一个棘手的问题。当我尝试在本地主机服务器上运行我的应用程序时,得到了此堆栈跟踪:

Exception in thread "main" java.lang.RuntimeException: No such var: db/get-user, compiling:(guestbook/routes/auth.clj:38:14)
    at clojure.lang.Compiler.analyze(Compiler.java:6380)
    at clojure.lang.Compiler.analyze(Compiler.java:6322)
    at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3573)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6562)
    at clojure.lang.Compiler.analyze(Compiler.java:6361)
    at clojure.lang.Compiler.access$100(Compiler.java:37)
    at clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:5973)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6560)
    at clojure.lang.Compiler.analyze(Compiler.java:6361)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6548)
    at clojure.lang.Compiler.analyze(Compiler.java:6361)
    at clojure.lang.Compiler.analyze(Compiler.java:6322)
    at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5708)
    at clojure.lang.Compiler$FnMethod.parse(Compiler.java:5139)
    at clojure.lang.Compiler$FnExpr.parse(Compiler.java:3751)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6558)
    at clojure.lang.Compiler.analyze(Compiler.java:6361)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6548)
    at clojure.lang.Compiler.analyze(Compiler.java:6361)
    at clojure.lang.Compiler.access$100(Compiler.java:37)
    at clojure.lang.Compiler$DefExpr$Parser.parse(Compiler.java:529)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6560)
    at clojure.lang.Compiler.analyze(Compiler.java:6361)
    at clojure.lang.Compiler.analyze(Compiler.java:6322)
    at clojure.lang.Compiler.compile1(Compiler.java:7148)
    at clojure.lang.Compiler.compile(Compiler.java:7219)
    at clojure.lang.RT.compile(RT.java:398)
    at clojure.lang.RT.load(RT.java:438)
    at clojure.lang.RT.load(RT.java:411)
    at clojure.core$load$fn__5018.invoke(core.clj:5530)
    at clojure.core$load.doInvoke(core.clj:5529)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clojure.core$load_one.invoke(core.clj:5336)
    at clojure.core$load_lib$fn__4967.invoke(core.clj:5375)
    at clojure.core$load_lib.doInvoke(core.clj:5374)
    at clojure.lang.RestFn.applyTo(RestFn.java:142)
    at clojure.core$apply.invoke(core.clj:619)
    at clojure.core$load_libs.doInvoke(core.clj:5413)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.core$apply.invoke(core.clj:619)
    at clojure.core$require.doInvoke(core.clj:5496)
    at clojure.lang.RestFn.invoke(RestFn.java:457)
    at guestbook.handler$loading__4910__auto__.invoke(handler.clj:1)
    at clojure.lang.AFn.applyToHelper(AFn.java:159)
    at clojure.lang.AFn.applyTo(AFn.java:151)
    at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3458)
    at clojure.lang.Compiler.compile1(Compiler.java:7153)
    at clojure.lang.Compiler.compile1(Compiler.java:7143)
    at clojure.lang.Compiler.compile(Compiler.java:7219)
    at clojure.lang.RT.compile(RT.java:398)
    at clojure.lang.RT.load(RT.java:438)
    at clojure.lang.RT.load(RT.java:411)
    at clojure.core$load$fn__5018.invoke(core.clj:5530)
    at clojure.core$load.doInvoke(core.clj:5529)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clojure.core$load_one.invoke(core.clj:5336)
    at clojure.core$compile$fn__5023.invoke(core.clj:5541)
    at clojure.core$compile.invoke(core.clj:5540)
    at user$eval19.invoke(form-init6949279956252999274.clj:1)
    at clojure.lang.Compiler.eval(Compiler.java:6619)
    at clojure.lang.Compiler.eval(Compiler.java:6609)
    at clojure.lang.Compiler.load(Compiler.java:7064)
    at clojure.lang.Compiler.loadFile(Compiler.java:7020)
    at clojure.main$load_script.invoke(main.clj:294)
    at clojure.main$init_opt.invoke(main.clj:299)
    at clojure.main$initialize.invoke(main.clj:327)
    at clojure.main$null_opt.invoke(main.clj:362)
    at clojure.main$main.doInvoke(main.clj:440)
    at clojure.lang.RestFn.invoke(RestFn.java:421)
    at clojure.lang.Var.invoke(Var.java:419)
    at clojure.lang.AFn.applyToHelper(AFn.java:163)
    at clojure.lang.Var.applyTo(Var.java:532)
    at clojure.main.main(main.java:37)
Caused by: java.lang.RuntimeException: No such var: db/get-user
    at clojure.lang.Util.runtimeException(Util.java:219)
    at clojure.lang.Compiler.resolveIn(Compiler.java:6848)
    at clojure.lang.Compiler.resolve(Compiler.java:6818)
    at clojure.lang.Compiler.analyzeSymbol(Compiler.java:6779)
    at clojure.lang.Compiler.analyze(Compiler.java:6343)
    ... 72 more
Compilation failed: Subprocess failed

我想我可能在这里装载了一些不需要的东西,但是我的project.clj文件看起来像这样:

(defproject guestbook "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :dependencies [[org.clojure/clojure "1.5.1"]
                 [compojure "1.1.6"]
                 [hiccup "1.0.5"]
                 [ring-server "0.3.1"]
                 [lein-light-nrepl "0.0.15"]
                 [org.clojure/clojurescript "0.0-2156"]
                 [org.clojure/java.jdbc "0.2.3"]
                 [org.xerial/sqlite-jdbc"3.7.2"]
                 [lib-noir "0.8.0"]]
  :repl-options {:nrepl-middleware [lighttable.nrepl.handler/lighttable-ops]}
  :plugins [[lein-ring "0.8.7"]
            [lein-ancient "0.5.4"]]
  :ring {:handler guestbook.handler/app
         :init guestbook.handler/init
         :destroy guestbook.handler/destroy}
  :aot :all
  :profiles
  {:production
   {:ring
    {:open-browser? false, :stacktraces? false, :auto-reload? false}}
   :dev
   {:dependencies [[ring-mock "0.1.5"] [ring/ring-devel "1.2.1"]]}})

主文件:

(ns guestbook.routes.home
  (:require [compojure.core :refer :all]
            [guestbook.views.layout :as layout]
            [hiccup.form :refer :all]
            [guestbook.models.db :as db]
            [noir.session :as session]))


(defn format-time [timestamp]
  (-> "dd/MM/yyyy"
      (java.text.SimpleDateFormat.)
      (.format timestamp)))


(defn home []
  (layout/common [:h1 "Guestbook"]
                 [:p "Welcome to my guestbook"]
                 [:hr]
                 [:form]
                 [:p "name"]
                 [:input]
                 [:p "Message"]
                 [:textarea {:rows 10 :cols 40}]))


(defn show-guests []
 [:ul.guests
   (for [{:keys [message name timestamp]} (db/read-guests)]
    [:li
       [:blockquote message]
       [:p "-" [:cite name]]
       [:time (format-time timestamp)]])])

(defn home [& [name message error]]
  (layout/common
    [:h1 "Guestbook " (session/get :user)]
    [:p "Welcome to my guestbook"]
    [:p error]

    (show-guests)

    [:hr]

    (form-to [:post "/"]
             [:p "Name:" (text-field "name" name)]
             [:p "Message:" (text-area {:rows 10 :cols 40} "message" message)]
             (submit-button "comment"))))


(defn save-message [name message]
 (cond
   (empty? name)
   (home name message "You forgot to leave a name, dumbass.")
   (empty? message)
   (home name message "Don't you have something to say?")
   :else
   (do
     (db/save-message name message)
     (home))))



(defroutes home-routes
  (GET "/" [] (home))
  (POST "/" [name message] (save-message name message)))

处理程序:

(ns guestbook.handler
  (:use compojure.core
        ring.middleware.resource
        ring.middleware.file-info
        hiccup.middleware
        guestbook.routes.home)
  (:require [compojure.handler :as handler]
            [compojure.route :as route]
            [guestbook.models.db :as db]
            [guestbook.routes.auth :refer [auth-routes]]))

(defn init []
  (println "guestbook is starting")
  (if-not (.exists (java.io.File. "./db.sq3"))
    (db/create-guestbook-table)))

(defn destroy []
  (println "guestbook is shutting down"))

(defroutes app-routes
  (route/resources "/")
  (route/not-found "Not Found"))

(def app
  (-> (routes auth-routes home-routes app-routes)
      (handler/site)
      (wrap-base-url)))

数据库:

(ns guestbook.models.db
  (:require [clojure.java.jdbc :as sql])
  (:import java.sql.DriverManager))

(def db {:classname  "org.sqlite.JDBC",
         :subprotocol   "sqlite",
         :subname       "db.sq3"})

(defn create-guestbook-table []
  (sql/with-connection
    db
    (sql/create-table
      :guestbook
      [:id "INTEGER PRIMARY KEY AUTOINCREMENT"]
      [:timestamp "TIMESTAMP DEFAULT CURRENT_TIMESTAMP"]
      [:name "TEXT"]
      [:message "TEXT"])
    (sql/do-commands "CREATE INDEX timestamp_index ON guestbook (timestamp)")))

(defn read-guests []
  (sql/with-connection
    db
    (sql/with-query-results res
      ["SELECT * FROM guestbook ORDER BY timestamp DESC"]
      (doall res))))

(defn save-message [name message]
  (sql/with-connection
    db
    (sql/insert-values
      :guestbook
      [:name :message :timestamp]
      [name message (new java.util.Date)])))

授权:

(ns guestbook.routes.auth
  (:require [compojure.core :refer [defroutes GET POST]]
            [guestbook.views.layout :as layout]
            [hiccup.form :refer
             [form-to label text-field password-field submit-button]]
            [noir.response :refer [redirect]]
            [noir.session :as session]
            [noir.validation
             :refer [rule errors? has-value? on-error]]
            [noir.util.crypt :as crypt]
            [guestbook.models.db :as db]))

(defn format-error [[error]]
  [:p.error error])

(defn control [field name text]
  (list (on-error name format-error)
        (label name text)
        (field name)
        [:br]))

(defn registration-page []
  (layout/common
    (form-to [:post "/register"]
      (control text-field :id "screen name")
      (control password-field :pass "Password")
      (control password-field :pass1 "Retype Password")
      (submit-button "Create Account"))))

(defn login-page []
  (layout/common
    (form-to [:post "/login"]
      (control text-field :id "screen name")
      (control password-field :pass "Password")
      (submit-button "login"))))

(defn handle-login [id pass]
  (let [user (db/get-user id)]
    (rule (has-value? id)
          [:id "screen name is required"])
    (rule (has-value? pass)
          [:pass "password is required"])
    (rule (and user (crypt/compare pass (:pass user)))
          [:pass "invalid password"])
    (if (errors? :id :pass)
    (login-page)
    (do
      (session/put! :user id)
      (redirect "/")))))

(defn handle-registration [id pass pass1]
  (rule (= pass pass1)
        [:pass "password was not retyped correctly"])
  (if (errors? :pass)
    (registration-page)
    (do
      (db/add-user-record {:id id :pass (crypt/encrypt pass)})
      (redirect "/login"))))

(defroutes auth-routes
  (GET "/register" [] (registration-page))
  (POST "/register" [id pass pass1]
        (handle-registration id pass pass1))

  (GET "/login" [] (login-page))
  (POST "/login" [id pass]
    (handle-login id pass))

  (GET "/logout" []
        (layout/common
          (form-to [:post "/logout"]
            (submit-button "logout"))))
  (POST "/logout" []
        (session/clear!)
        (redirect "/")))

有人可以帮我放松一下,让我重新开始学习本教程吗?同样,有关如何基于不赞成使用的库有效更新代码的任何技巧也将有所帮助。我为冗长的代码表示歉意,但我仍然是菜鸟,也不完全知道问题出在哪里。我怀疑它与数据库依赖项有关系,因为在我的Google搜索[org.clojure / java.jdbc“ 0.2.3”]依赖项中,特别是sql / with-connection已弃用现在版本0.3.3。

鬼魂

请注意stacktrace的第一行: Exception in thread "main" java.lang.RuntimeException: No such var: db/get-user, compiling:(guestbook/routes/auth.clj:38:14)

db/get-user在编译时会查找并找不到它auth.clj并指出问题在第38行第14列。您别名dbguestbook.models.db让我们在中查找一个get-user函数guestbook/models/db.clj不在那里!将功能添加到db.clj从中删除该功能的所有用法auth.clj

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

“使用Clojure进行Web开发”-编译错误:无此类变量:sql / create-table

来自分类Dev

Get steamID by user nickname

来自分类Dev

Django 使用 request.user.get_username() 填充隐藏输入

来自分类Dev

如何使用 get_user_info 进行 Discord.py 重写

来自分类Dev

从版本4.5开始不推荐使用get_currentuserinfo!使用wp_get_current_user()代替

来自分类Dev

Django在单独的数据库上进行测试,给出“ OperationalError:无此类表:auth_user”

来自分类Dev

Django在单独的数据库上进行测试,给出“ OperationalError:无此类表:auth_user”

来自分类Dev

How to get logged user with Angular?

来自分类Dev

Graphite Web错误日志,OperationalError:无此类表:auth_user

来自分类Dev

Graphite Web错误日志,OperationalError:无此类表:auth_user

来自分类Dev

get_user(id)找不到用户-返回无(自身bot discord.py)

来自分类Dev

无法使用wp_login钩子上的WordPress中的get_user_by或wp_get_current_user函数访问用户详细信息

来自分类Dev

无法使用wp_login钩子上的WordPress中的get_user_by或wp_get_current_user函数访问用户详细信息

来自分类Dev

Get Facebook User ID from app-scoped User ID

来自分类Dev

get_current_user_id()不能与wp_login挂钩一起使用-WordPress

来自分类Dev

Rails 6:使用GET而不是DELETE链接到destroy_user_session_path

来自分类Dev

忍者使用get_user_meta将渲染值呈现给隐藏字段

来自分类Dev

get_current_user_id()不能与wp_login挂钩一起使用-WordPress

来自分类Dev

是什么原因导致使用get_user_meta的WP中出现此错误?

来自分类Dev

使用get_current_user_id()的简单IF语句出现问题

来自分类Dev

与lookup_user一起使用get_followers_ids

来自分类Dev

Get User name and Profile picture using FBSDKLoginkit

来自分类Dev

(int)$ _ GET ['user_input']安全吗?

来自分类Dev

PHP:get_current_user()与exec('whoami')

来自分类Dev

Get user profile image Android facebook SDK

来自分类Dev

How to get the domain of currently logged on user in Windows?

来自分类Dev

Sitecore Powershell get-user命令

来自分类Dev

Powershell Try/catch - get-user

来自分类Dev

为什么我的IOCTL调用可与copy_from_user一起使用,而不能与get_user一起使用?

Related 相关文章

  1. 1

    “使用Clojure进行Web开发”-编译错误:无此类变量:sql / create-table

  2. 2

    Get steamID by user nickname

  3. 3

    Django 使用 request.user.get_username() 填充隐藏输入

  4. 4

    如何使用 get_user_info 进行 Discord.py 重写

  5. 5

    从版本4.5开始不推荐使用get_currentuserinfo!使用wp_get_current_user()代替

  6. 6

    Django在单独的数据库上进行测试,给出“ OperationalError:无此类表:auth_user”

  7. 7

    Django在单独的数据库上进行测试,给出“ OperationalError:无此类表:auth_user”

  8. 8

    How to get logged user with Angular?

  9. 9

    Graphite Web错误日志,OperationalError:无此类表:auth_user

  10. 10

    Graphite Web错误日志,OperationalError:无此类表:auth_user

  11. 11

    get_user(id)找不到用户-返回无(自身bot discord.py)

  12. 12

    无法使用wp_login钩子上的WordPress中的get_user_by或wp_get_current_user函数访问用户详细信息

  13. 13

    无法使用wp_login钩子上的WordPress中的get_user_by或wp_get_current_user函数访问用户详细信息

  14. 14

    Get Facebook User ID from app-scoped User ID

  15. 15

    get_current_user_id()不能与wp_login挂钩一起使用-WordPress

  16. 16

    Rails 6:使用GET而不是DELETE链接到destroy_user_session_path

  17. 17

    忍者使用get_user_meta将渲染值呈现给隐藏字段

  18. 18

    get_current_user_id()不能与wp_login挂钩一起使用-WordPress

  19. 19

    是什么原因导致使用get_user_meta的WP中出现此错误?

  20. 20

    使用get_current_user_id()的简单IF语句出现问题

  21. 21

    与lookup_user一起使用get_followers_ids

  22. 22

    Get User name and Profile picture using FBSDKLoginkit

  23. 23

    (int)$ _ GET ['user_input']安全吗?

  24. 24

    PHP:get_current_user()与exec('whoami')

  25. 25

    Get user profile image Android facebook SDK

  26. 26

    How to get the domain of currently logged on user in Windows?

  27. 27

    Sitecore Powershell get-user命令

  28. 28

    Powershell Try/catch - get-user

  29. 29

    为什么我的IOCTL调用可与copy_from_user一起使用,而不能与get_user一起使用?

热门标签

归档