我使用Chestnut建立了一个基本的ClojureScript项目,并顺利地完成了“Hello World”的步骤。然而,我真的很想和我的后端进行通信。为此,我重新定义了Reagent代码如下:
(defn greeting []
[:input {:type "button"
:value (:text @app-state)
:on-click #(http/get {})}])
当点击链接时,会得到404响应。所以至少我正在和某人交流。我还可以在服务器日志文件中看到我的get请求的证据。然而,在这个阶段,我正在努力解决一些概念上的问题。
首先,http/get是在clj-http.client中定义的函数,它不是Chestnut设置的一部分。如果我必须去寻找库来发送像get请求这样基本的东西,那么似乎我已经偏离了正轨。
其次,用户命名空间的文件由Chestnut预定义了以下行:
(def http-handler
(wrap-reload #'mypage.server/http-handler))
(defn run []
(figwheel/start-figwheel!))
我看不到任何地方使用 http-handler。所以我不理解那个定义的作用。
此外,据我了解 Figwheel,当我调用“run”时,它将启动一个新的 Web 服务器,然后 a) 提供 index.html,并通过某个 TCP 端口连接到我的浏览器,并开始通过该连接传输新的 JavaScript。这第二部分是我自己的推测。如果实际上是这样发生的,我的下一个问题就是,Figwheel 是否还需要坐在该连接的另一侧,或者浏览器是否具有一些公共 API,允许从外部重新加载代码。
最后,我可以感觉到 mypage/server.clj 文件中定义的环路路由和 http-handler 被某种方式调用,因为修改它们会更改来自 get 请求的错误,但我完全不知道这是如何工作的。据我理解,我从浏览器发送的 get 请求被发送到网站的起源 Figwheel-server。我没有理由相信 Figwheel 知道我在服务器文件中定义的 http-handlers。
(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))