【发布时间】:2021-05-28 03:48:42
【问题描述】:
怎么样了?
我的代码可以找到HERE
我一直在尝试通过关注 guide 来学习 Clojure,但我不太确定为什么这段代码不起作用。
代码如下:
(ns calc-api.server.server
(:require [ring.adapter.jetty :as jetty]
[ring.middleware.params :as params]
[ring.util.http-response :as response]
[reitit.ring.middleware.muuntaja :as muuntaja]
[muuntaja.core :as m]
[reitit.ring.coercion :as coercion]
[reitit.ring :as ring]))
(def hello-routes
["/hello" {:get {:handler (fn [_]
(response/ok {:mesage "Hello Reitit!"}))}}])
(def app
(ring/ring-handler
(ring/router
[hello-routes]
{:data {:muuntaja m/instance
:middleware [params/wrap-params
muuntaja/format-middleware
coercion/coerce-exceptions-middleware
coercion/coerce-request-middleware
coercion/coerce-response-middleware]}})
(ring/create-default-handler)))
(defonce running-server (atom nil))
(defn start
[]
(when (nil? @running-server)
(reset! running-server (jetty/run-jetty #'app {:port 3000
:join? false})))
(println "Server running in port 3000"))
(defn stop
[]
(when-not (nil? @running-server)
(.stop @running-server)
(reset! running-server nil))
(println "Server stopped"))
当我运行 REPL 并切换到 calc-api 命名空间并运行 (start) 函数时:
lein repl
(in-ns 'calc-api.server.server)
(start)
我期待服务器运行并打印“服务器正在端口 x 上运行”,但结果如下:
Syntax error compiling at (/tmp/form-init2855747266943058886.clj:1:1).
Unable to resolve symbol: start in this context
关于为什么会发生这种情况的任何想法?非常感谢所有帮助。
编辑[1]
按照Alan Thompson's 的建议,发生了以下事情:
将我的代码和依赖项复制到模板的文件夹中,运行 lein clean + lein run 结果
{:clojure.main/message
"Syntax error compiling at (demo/core.clj:50:3).\nNo such namespace: log\n",
:clojure.main/triage
{:clojure.error/phase :compile-syntax-check,
:clojure.error/line 50,
:clojure.error/column 3,
:clojure.error/source "core.clj",
:clojure.error/path "demo/core.clj",
:clojure.error/class java.lang.RuntimeException,
:clojure.error/cause "No such namespace: log"},
:clojure.main/trace
{:via
[{:type clojure.lang.Compiler$CompilerException,
:message "Syntax error compiling at (demo/core.clj:50:3).",
:data
{:clojure.error/phase :compile-syntax-check,
:clojure.error/line 50,
:clojure.error/column 3,
:clojure.error/source "demo/core.clj"},
:at [clojure.lang.Compiler analyze "Compiler.java" 6812]}
{:type java.lang.RuntimeException,
:message "No such namespace: log",
:at [clojure.lang.Util runtimeException "Util.java" 221]}],
:trace
[[clojure.lang.Util runtimeException "Util.java" 221]
[clojure.lang.Compiler resolveIn "Compiler.java" 7388]
[clojure.lang.Compiler resolve "Compiler.java" 7362]
[clojure.lang.Compiler analyzeSymbol "Compiler.java" 7323]
[clojure.lang.Compiler analyze "Compiler.java" 6772]
[clojure.lang.Compiler analyze "Compiler.java" 6749]
[clojure.lang.Compiler$InvokeExpr parse "Compiler.java" 3824]
[clojure.lang.Compiler analyzeSeq "Compiler.java" 7113]
[clojure.lang.Compiler analyze "Compiler.java" 6793]
[clojure.lang.Compiler analyze "Compiler.java" 6749]
[clojure.lang.Compiler$BodyExpr$Parser parse "Compiler.java" 6122]
[clojure.lang.Compiler$FnMethod parse "Compiler.java" 5471]
[clojure.lang.Compiler$FnExpr parse "Compiler.java" 4033]
[clojure.lang.Compiler analyzeSeq "Compiler.java" 7109]
[clojure.lang.Compiler analyze "Compiler.java" 6793]
[clojure.lang.Compiler analyzeSeq "Compiler.java" 7099]
[clojure.lang.Compiler analyze "Compiler.java" 6793]
[clojure.lang.Compiler access$300 "Compiler.java" 38]
[clojure.lang.Compiler$DefExpr$Parser parse "Compiler.java" 596]
[clojure.lang.Compiler analyzeSeq "Compiler.java" 7111]
[clojure.lang.Compiler analyze "Compiler.java" 6793]
[clojure.lang.Compiler analyze "Compiler.java" 6749]
[clojure.lang.Compiler eval "Compiler.java" 7185]
[clojure.lang.Compiler load "Compiler.java" 7640]
[clojure.lang.RT loadResourceScript "RT.java" 381]
[clojure.lang.RT loadResourceScript "RT.java" 372]
[clojure.lang.RT load "RT.java" 459]
[clojure.lang.RT load "RT.java" 424]
[clojure.core$load$fn__6856 invoke "core.clj" 6115]
[clojure.core$load invokeStatic "core.clj" 6114]
[clojure.core$load doInvoke "core.clj" 6098]
[clojure.lang.RestFn invoke "RestFn.java" 408]
[clojure.core$load_one invokeStatic "core.clj" 5897]
[clojure.core$load_one invoke "core.clj" 5892]
[clojure.core$load_lib$fn__6796 invoke "core.clj" 5937]
[clojure.core$load_lib invokeStatic "core.clj" 5936]
[clojure.core$load_lib doInvoke "core.clj" 5917]
[clojure.lang.RestFn applyTo "RestFn.java" 142]
[clojure.core$apply invokeStatic "core.clj" 669]
[clojure.core$load_libs invokeStatic "core.clj" 5974]
[clojure.core$load_libs doInvoke "core.clj" 5958]
[clojure.lang.RestFn applyTo "RestFn.java" 137]
[clojure.core$apply invokeStatic "core.clj" 669]
[clojure.core$require invokeStatic "core.clj" 5996]
[clojure.core$require doInvoke "core.clj" 5996]
[clojure.lang.RestFn invoke "RestFn.java" 408]
[user$eval142$fn__146 invoke "form-init13165779102252361276.clj" 1]
[user$eval142 invokeStatic "form-init13165779102252361276.clj" 1]
[user$eval142 invoke "form-init13165779102252361276.clj" 1]
[clojure.lang.Compiler eval "Compiler.java" 7181]
[clojure.lang.Compiler eval "Compiler.java" 7171]
[clojure.lang.Compiler load "Compiler.java" 7640]
[clojure.lang.Compiler loadFile "Compiler.java" 7578]
[clojure.main$load_script invokeStatic "main.clj" 475]
[clojure.main$init_opt invokeStatic "main.clj" 477]
[clojure.main$init_opt invoke "main.clj" 477]
[clojure.main$initialize invokeStatic "main.clj" 508]
[clojure.main$null_opt invokeStatic "main.clj" 542]
[clojure.main$null_opt invoke "main.clj" 539]
[clojure.main$main invokeStatic "main.clj" 664]
[clojure.main$main doInvoke "main.clj" 616]
[clojure.lang.RestFn applyTo "RestFn.java" 137]
[clojure.lang.Var applyTo "Var.java" 705]
[clojure.main main "main.java" 40]],
:cause "No such namespace: log",
:phase :compile-syntax-check}}
我认为这与我的原始代码无关?
编辑[2]
我找到了一个我不喜欢但适用于我的学习目的的解决方案。我将 core.clj 文件更改为需要服务器命名空间并从那里调用 start 函数。
(ns calc-api.core
(:gen-class))
(require '[calc-api.server.server :as calc-api-server])
(defn -main
"I don't do a whole lot ... yet."
[& args]
(calc-api-server/start))
这意味着每次我想停止服务器时都必须 cmd+d,但至少它可以工作。感谢您提供的所有帮助。
【问题讨论】:
-
代码在什么文件里?请注意,NS 中的连字符必须是文件名中的下划线,例如
src/calc_api/server/server.clj或类似 -
有一个主文件夹,里面有doc、resources、server(server.clj所在的位置)、src/calc_api(core.clj所在的位置)、target、test。所以我的服务器文件夹/文件中没有取消标记或连字符。
-
对于 Leiningen 项目,源文件(
*.clj、*.cljs和*.cljc)为 typically under thesrcortestdirectories。我看到你项目中的源文件server/server.clj应该是src/calc_api/server/server.clj。 -
@SteffanWestcott 将文件夹移动到 src/calc_api/server/server.clj 并且问题仍然存在。
-
@MauricioSouza 很好,但请更新您的 Github 存储库中的代码,否则我们将难以有效地帮助您。