clojure - 如何使用 ClojureScript 和 Figwheel 与后端通信?

标签 clojure clojurescript ring figwheel

注意:我总体来说是一名经验丰富的程序员,并且使用 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的方式,当我调用“run”时,它会启动一个新的Web服务器,然后a)提供index.html,b)通过一些TCP端口连接到我的浏览器并开始泵送新的JavaScript通过那个连接。对我而言,第二部分非常具有推测性。如果这确实发生了,我的下一个问题是 Figwheel 是否也需要位于该连接的另一侧,或者浏览器是否有一些允许从外部重新加载代码的通用 API。

最后,我可以看出 mypage/server.clj 文件(如下)中定义的环路由和 http-handler 正在以某种方式被调用,因为修改这些更改了 get-request 中的错误,但这完全是一个谜对我来说这是如何运作的。据我了解,我从浏览器发送的获取请求被发送到Figwheel服务器,即网站的起源。我没有理由相信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))

最佳答案

对于 ClojureScript 项目(即不是 Clojure),我相信您想要这个:https://github.com/r0man/cljs-http

关于clojure - 如何使用 ClojureScript 和 Figwheel 与后端通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37926881/

相关文章:

clojure - 分解环形中间件场景

具有多个调度值的 Clojure 多方法

clojure - 使用lein uberjar时如何省略资源目录

Clojure transient 的使用

clojure - 什么时候在 Clojure 宏中使用 ~'some-symbol?

clojure - 多方法的通用语法

clojure - Clojure Ring 是否为每个请求创建一个线程?

css - 如何将css文件包含到compojure元素中?

java - Clojure 的平均亮度非常慢

jquery - 如何使用 Om/Clojurescript(来自 jQuery)在 React 中实现基本动画?