注意:总的来说,我是一名经验丰富的程序员,使用 clojure,但从未进行过认真的 Web 开发。
我使用 Chestnut 建立了一个基本的 ClojureScript 项目,并顺利完成了“Hello World”步骤。但是我真的很想和我的后端谈谈。为此,我将试剂代码重新定义为
(defn greeting []
[:input {:type "button"
:value (:text @app-state)
:on-click #(http/get {})}])
单击时会得到 404 响应。所以至少我在和某人说话。我还可以在 server.log 文件中看到我的获取请求的证据。然而,在这一点上,我正在努力解决一些概念问题。
首先,http/get 是一个在 clj-http.client 中定义的函数,它不是 Chestnut 设置的一部分。如果我不得不去寻找图书馆来发送像获取请求这样基本的东西,那感觉就像我已经偏离了轨道。
其次,用户命名空间的文件具有 Chestnut 预定义的以下行:
(def http-handler
(wrap-reload #'mypage.server/http-handler))
(defn run []
(figwheel/start-figwheel!))
我看不到任何使用过 http-handler 的地方。所以我不明白这个定义到底是做什么的。
也是我理解 Figwheel 的方式,当我调用“运行”时,它会启动一个新的 Web 服务器,然后 a) 为 index.html 提供服务,b) 通过某个 TCP 端口连接到我的浏览器并开始通过该连接注入新的 JavaScript . 第二部分对我来说非常投机。如果这确实发生了,我的下一个问题是 Figwheel 是否也需要位于该连接的另一端,或者浏览器是否有一些允许从外部重新加载代码的通用 API。
最后,我可以说 mypage/server.clj 文件(如下)中定义的环路由和 http-handler 正在以某种方式被调用,因为修改这些会更改 get-request 中的错误,但是对我来说如何完全是个谜这行得通。我理解它的方式,我从浏览器发送的 get-request 被发送到站点的来源 Figwheel-server。我没有理由相信 Figwheel 对我在服务器文件中定义的 http 处理程序一无所知。
(defroutes routes
(GET "/" _
{:status 200
:headers {"Content-Type" "text/html; charset=utf-8"}
:body (io/input-stream (io/resource "public/index.html"))})
(resources "/"))
(def http-handler
(-> routes
(wrap-defaults api-defaults)
wrap-with-logger
wrap-gzip))